做单片机开发,最经常用到的软件一定是串口调试助手!
(肯定不是 Eclipse ,万一有人用 Keil 呢? )
感谢丁丁,给嵌入式工程师开发了这么棒的工具!
(吐槽一句串口调试助手的健壮性,运行的时候拔串口难道就不能给个提示然后关掉软件吗!一定要开任务管理器关闭吗!)
最近项目开发,需要读取激光雷达的数据,处理后通过 LabVIEW 利用 VISA 接口发送给单片机(没办法,毕竟比赛是 NI 公司赞助的,手动摊手)。因为激光雷达提供的接口是 C++ 的程序,只能通过 DLL 动态库的形式在 LabVIEW 中运行(详见:http://sunhx.cn/a/chengxu/2016/0412/23.html),每次运行动态库都会做接口的初始化然后再读取信息,频率过高会读取失败(事实证明,越低级的语言越高级),于是尝试绕过 LabVIEW 直接通过串口发送数据(好吧,我承认,原来是不会用 C++ 开串口)。
激光雷达使用的是 RoboPeak 团队开发的 RPLIDAR 。可以实现 360 度 6 米范围内的激光测距扫描,产生所在空间的平面点云地图信息用于地图测绘、机器人定位导航、物体/环境建模等应用(如果团队看到请联系我广告费)。
官方提供的 DEMO 里有个控制台应用程序的流程是这样的:
改写思路是在打开激光雷达的端口后,打开单片机端口并初始化,显示数据部分改为循环的数据的简单处理后通过串口发送。
具体修改过程比较复杂,这里放上一个简单的串口收发 C++ 程序做参考。
#include
#include
HANDLE hCom;
int main(void)
{
hCom=CreateFile(TEXT("COM3"),
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);
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;
dcb.ByteSize=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);
}
}
注意:
-
文件名为“COMX”,X表示端口号,如果 X 超过 10 需要另外的书写方式。
-
因为 hCom 句柄不是文件句柄,不能使用通常的 fwrite 和 fread 方法,要用 ReadFile 和 WriteFile 方法。
-
因为 ReadFile 是阻塞函数,会一直检查直到读取到信息,需要通过 COMMTIMEOUTS 结构体设置超时设置(当然,这次项目中并不需要读取信息)。
其实激光雷达的 DEMO 中还提供了 MFC 的图形界面,有了对控制台应用程序的修改经验对 MFC 的数据处理部分函数做简单修改后也成功的实现了数据的串口发送,而且还有了图形显示,程序算法的调整更加方便了。
(当然,具体修改过程,因为我对 MFC 也不是很了解就不放出来了,如果有需要的话我们可以单独 交易 交流)
|