当前位置: 主页 > 程序 >

纯C++串口通信

时间:2016-08-29  作者:haden   点击:
【摘要】摆脱LabVIEW,C++翻身做主人!!!!
做单片机开发,最经常用到的软件一定是串口调试助手!
(肯定不是 Eclipse ,万一有人用 Keil 呢? cool
感谢丁丁,给嵌入式工程师开发了这么棒的工具!
(吐槽一句串口调试助手的健壮性,运行的时候拔串口难道就不能给个提示然后关掉软件吗!一定要开任务管理器关闭吗!angry

 
 
最近项目开发,需要读取激光雷达的数据,处理后通过 LabVIEW 利用 VISA 接口发送给单片机(没办法,毕竟比赛是 NI 公司赞助的,手动摊手)。因为激光雷达提供的接口是 C++ 的程序,只能通过 DLL 动态库的形式在 LabVIEW 中运行(详见:http://sunhx.cn/a/chengxu/2016/0412/23.html),每次运行动态库都会做接口的初始化然后再读取信息,频率过高会读取失败(事实证明,越低级的语言越高级),于是尝试绕过 LabVIEW 直接通过串口发送数据(好吧,我承认,原来是不会用 C++ 开串口blush)。

 
 
激光雷达使用的是 RoboPeak 团队开发的 RPLIDAR 。可以实现 360 度 6 米范围内的激光测距扫描,产生所在空间的平面点云地图信息用于地图测绘、机器人定位导航、物体/环境建模等应用(如果团队看到请联系我广告费yes)。

官方提供的 DEMO 里有个控制台应用程序的流程是这样的:

 
 
改写思路是在打开激光雷达的端口后,打开单片机端口并初始化,显示数据部分改为循环的数据的简单处理后通过串口发送。
 
 
具体修改过程比较复杂,这里放上一个简单的串口收发 C++ 程序做参考。
 

#include 
#include 
HANDLE hCom;

int main(void)
{
	hCom=CreateFile(TEXT("COM3"),//COM1口
		GENERIC_READ|GENERIC_WRITE, //允许读和写
		0, //独占方式
		NULL,
		OPEN_EXISTING, //打开而不是创建
		0, //同步方式
		NULL);
	if(hCom==(HANDLE)-1)
	{
		printf("打开COM失败!\n");
		return FALSE;
	}
	else
	{
		printf("COM打开成功!\n");
	}
	SetupComm(hCom,1024,1024); //输入缓冲区和输出缓冲区的大小都是1024
	COMMTIMEOUTS TimeOuts;
	
	//设定读超时
	TimeOuts.ReadIntervalTimeout=1000;
	TimeOuts.ReadTotalTimeoutMultiplier=500;
	TimeOuts.ReadTotalTimeoutConstant=5000;
	//设定写超时
	TimeOuts.WriteTotalTimeoutMultiplier=500;
	TimeOuts.WriteTotalTimeoutConstant=2000;
	SetCommTimeouts(hCom,&TimeOuts); //设置超时
	
	DCB dcb;
	GetCommState(hCom,&dcb);
	dcb.BaudRate=9600; //波特率为9600
	dcb.ByteSize=8; //每个字节有8位
	dcb.Parity=NOPARITY; //无奇偶校验位
	dcb.StopBits=ONE5STOPBITS; //两个停止位
	SetCommState(hCom,&dcb);
	
	DWORD wCount;//写入的字节数
	BOOL bReadStat;
	DWORD rCount;
	
	while(1)
	{
		PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR); //清空缓冲区
		char str[9]={0};
		printf("%s\n",str);
		bReadStat=ReadFile(hCom,str,9,&rCount,NULL);
		if(!bReadStat)
		{
			printf("读串口失败!\n");
			return FALSE;
		}
		else
		{
			str[8]='\0';
			printf("%s\n",str);
			if(WriteFile(hCom, str, 8, &wCount, NULL) == 0)
				printf("写串口失败!\n");
		}
		Sleep(100);
	}
}

        

注意:
  1. 文件名为“COMX”,X表示端口号,如果 X 超过 10 需要另外的书写方式。
  2. 因为 hCom 句柄不是文件句柄,不能使用通常的 fwrite 和 fread 方法,要用 ReadFile 和 WriteFile 方法。
  3. 因为 ReadFile 是阻塞函数,会一直检查直到读取到信息,需要通过 COMMTIMEOUTS 结构体设置超时设置(当然,这次项目中并不需要读取信息)。
 
 
其实激光雷达的 DEMO 中还提供了 MFC 的图形界面,有了对控制台应用程序的修改经验对 MFC 的数据处理部分函数做简单修改后也成功的实现了数据的串口发送,而且还有了图形显示,程序算法的调整更加方便了。
(当然,具体修改过程,因为我对 MFC 也不是很了解就不放出来了,如果有需要的话我们可以单独 交易 交流)

顶一下
(4)
100%
踩一下
(0)
0%
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
验证码: 点击我更换图片

推荐内容