用Win32API写串口调试程序,关于循环侦听串口消息的有关问题
用Win32API写串口调试程序,关于循环侦听串口消息的问题
临下班前发个贴。
工程描述:
1 串口调试程序,串口部分是基于Win32 API的,就是用CreateFile,WriteFile,ReadFile
2
3
4
问题描述:
1 向串口发送数据没有问题(经测试)
2 手动接收数据(即我按一下Button,函数执行一次。)有问题
2.1 如果我发一条,接收一条,是OK的;
2.2 如果我不发,直接接收,接收线程会堵死;
3 现在我在一开始的时候就启动接收线程,接收线程就会像2.2那样直接堵死,代码如下:
/* 接收线程(侦听串口) */
4 3的代码有一个很明显的问题:我只有先Read串口,接下来才能判断串口是否有数据进入;但是一旦串口没有数据的情况下,Read串口就会堵死线程。
5 我尝试用
也不知道是我设置不对,还是怎么怎么地,发现米的效果
不知道大家有没有什么好的意见或建议
最好是实际的经验,太理论的东西对小马帮助很小的哇
------解决方案--------------------
不懂 帮顶
------解决方案--------------------
你是第一次操作串口?
串口的读取线程是要通过事件控制的
网上很多例子的
不过我手的例子都是MFC
要不然就给你段代码参考了
------解决方案--------------------
1.线程中不要直接操作界面
2.串口接收是有事件的
3.线程会堵死是因为线程里没有sleep
临下班前发个贴。
工程描述:
1 串口调试程序,串口部分是基于Win32 API的,就是用CreateFile,WriteFile,ReadFile
2
- C/C++ code
hCon = CreateFile(g_ctrPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, 2222222 OPEN_EXISTING, _FLAG_OVERLAPPED, NULL);
3
- C/C++ code
SetupComm(hCon,1024,1024); PurgeComm(hCon,PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR); SetCommMask(hCon, EV_BREAK|EV_CTS|EV_DSR|EV_ERR|EV_RING|EV_RLSD |EV_RXCHAR|EV_RXFLAG|EV_TXEMPTY);
4
- C/C++ code
DCB g_dcb;
问题描述:
1 向串口发送数据没有问题(经测试)
- C/C++ code
WriteFile(hCon,buffer_send,dw_buffer,&dw_buffer,NULL);
2 手动接收数据(即我按一下Button,函数执行一次。)有问题
- C/C++ code
ReadFile(hCon,(void *)buffer_recv.GetBuffer(buffer_recv.GetLength()),dw_buffer,&dw_buffer,NULL)
2.1 如果我发一条,接收一条,是OK的;
2.2 如果我不发,直接接收,接收线程会堵死;
3 现在我在一开始的时候就启动接收线程,接收线程就会像2.2那样直接堵死,代码如下:
/* 接收线程(侦听串口) */
- C/C++ code
while(TRUE) { //经查MSDN,ReadFile为True的情况很多,所以加上了一个buffer_recv是否为空的判断 if (ReadFile(hCon,(void *)buffer_recv.GetBuffer(buffer_recv.GetLength()),dw_buffer,&dw_buffer,NULL) && buffer_recv.IsEmpty()) { g_record.InsertString(nLine,buffer_recv);//在“消息记录”上面增加一条消息 nLine++; buffer_recv.Empty();//清空buffer } else { continue; } }
4 3的代码有一个很明显的问题:我只有先Read串口,接下来才能判断串口是否有数据进入;但是一旦串口没有数据的情况下,Read串口就会堵死线程。
5 我尝试用
- C/C++ code
_COMMTIMEOUTS TimeOut;//超时结构体 TimeOut.ReadTotalTimeoutConstant = 50;//这两个参数只知道单位是毫秒,具体指什么我不是很clear TimeOut.WriteTotalTimeoutConstant = 50; SetCommTimeouts(hCon,&TimeOut);//设置超时
也不知道是我设置不对,还是怎么怎么地,发现米的效果
不知道大家有没有什么好的意见或建议
最好是实际的经验,太理论的东西对小马帮助很小的哇
------解决方案--------------------
不懂 帮顶
------解决方案--------------------
你是第一次操作串口?
串口的读取线程是要通过事件控制的
网上很多例子的
不过我手的例子都是MFC
要不然就给你段代码参考了
------解决方案--------------------
1.线程中不要直接操作界面
2.串口接收是有事件的
3.线程会堵死是因为线程里没有sleep