串口通信,线程中WaitForSingleObject返回258超时,求助

s_chhong 2017-12-04 03:26:53
这几天参照CSDN这个资料http://bbs.csdn.net/topics/390248377
(请大佬们打开这个链接,里边有源码和碰到的问题,但没有最终解决答复,我现在碰到的问题跟里边一模一样,源码也跟里边一样),在弄两台pc串口通信,目前碰到的问题跟连接中一样,在一台pc中发送数据,另一台pc接收不到(另一台pc采用串口调试小软件可接受到信息),追查到
dwResult=WaitForSingleObject(tOverLaped.hEvent,100); dwResult一直258超时;
WaitCommEvent(pDlg->hCom,&dwEvtMask,&tOverLaped);返回值一直是0;求助怎么回事,感激不尽。
...全文
1053 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-12-05
  • 打赏
  • 举报
回复
电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息…… 对电脑而言没有乱码,只有二进制字节;对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A
s_chhong 2017-12-05
  • 打赏
  • 举报
回复
引用 2 楼 oyljerry 的回复:
看看pDlg->hCom这个变量的值是否跟创建的一样。
谢谢斑竹,确实pDlg->hCom跟创建的句柄不同,导致监控的事件对象一直没信号,重新定义句柄后可以接收到数据。 还有个问题,求指导。目前发现发送字符串长度大于4个汉字时,每4个汉字会触发一次事件信号,比如 //发送数据 m_edit.GetWindowText(str); CListBox* m_listbox=(CListBox*)GetDlgItem(IDC_LIST1); wOverLaped.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL); //创建一个事件对象 if (WriteFile(hCom,str,str.GetLength(),&factdata,&wOverLaped)) //线程函数监控信号 DWORD ThreadFunction(LPVOID pParam) { DWORD dwEvtMask ,dwResult; tOverLaped.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL); //创建一个事件 使用手动重置为无信号状态,初始化时为无信号状态 while (IsFun) { WaitCommEvent(hCom,&dwEvtMask,&tOverLaped);// 为特指的通信设备等待一个事件发生,该函数所监控的事件是与该设备句柄相关联的一系列事件 /*lpEvtMask:一个指向DWORD的指针。如果发生错误,pEvtMask指向0,否则函数执行完如果检测到串口通信事件的话就将其写入该参数中*/ dwResult = WaitForSingleObject(tOverLaped.hEvent,100); //如果事件没有信号,延时0.1秒 if(dwResult==WAIT_OBJECT_0) //事件对象有信号 WAIT_OBJECT_0核心对象已被激活 WAIT_TIMEOUT { if(dwEvtMask==EV_RXCHAR) //接收到数据 { ::PostMessage(AfxGetApp()->GetMainWnd()->m_hWnd, CM_RECEIVE,0,(LPARAM)EV_RXCHAR); } } } return 0; } 当发送的数据是“忐忐忑忑”时,线程监控到一次信号,让读写CM_RECEIVE处理。 当发送数据是“忐忐忑忑他”时,线程监控到两次信号; 以此类推,每4个汉字,线程中捕捉到以此信号,不知道为什么会这样? 我的想法是让发送的字符串完整以此接受处理。
oyljerry 2017-12-04
  • 打赏
  • 举报
回复
看看pDlg->hCom这个变量的值是否跟创建的一样。
s_chhong 2017-12-04
  • 打赏
  • 举报
回复
起初运行到 WaitCommEvent(((Cpc_pc_apiDlg*)AfxGetMainWnd())->hCom,&dwEvtMask,&tOverLaped);//等待窗口事件 提示 pc_pc_api.exe 中的 0x00413197 处未处理的异常: 0xC0000005: 读取位置 0x00000478 时发生访问冲突 。 后来按照一位板斧的回复 WaitCommEvent(((Cpc_pc_apiDlg*)AfxGetMainWnd())->hCom,&dwEvtMask,&tOverLaped); 改为 Cpc_pc_apiDlg * pDlg = (Cpc_pc_apiDlg*)pParam; WaitCommEvent(pDlg->hCom,&dwEvtMask,&tOverLaped); 可以通过,不过目前接受不到信息,好像是pDlg->hCom句柄无效。

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧