阅读:2063回复:4
多线程串口通讯问题
我做了两个读写串口的线程,目的是先写串口,然后从串口读数据,然后再写再读,一直下去。为什么我们调试的时候写线程完毕,再读一次的时候程序就不走了呀!我的代码如下:
hEventWrite = CreateEvent(NULL,FALSE,FALSE,NULL); hEventRead = CreateEvent(NULL,FALSE,FALSE,NULL); SetEvent(hEventWrite); AfxBeginThread(ThreadWrite,NULL); AfxBeginThread(ThreadRead,NULL); UINT ThreadWrite(LPVOID pParam) { while(1) { WaitForSingleObject(hEventWrite,INFINITE); rewrite: switch(code) { case 0x02: { UpgradeInfo upgradeinfo={NO2,0x0500,0x0000,0x0000,0x00}; length1=tagFile.GetLength(); upgradeinfo.filesize=(int)length1; unsigned char *p=(unsigned char*)&upgradeinfo ; long size=sizeof(upgradeinfo)-sizeof(BYTE); sum1=0xAA; while(size--) { sum1+=*p; p++; } *p=sum1; fState = WriteFile(m_hCom, (void*)&upgradeinfo, sizeof(upgradeinfo), &length, NULL); break; } case 0x05: { ReReciveSize rereceivesize={NO5}; fState = WriteFile(m_hCom, (void*)&rereceivesize, sizeof(rereceivesize), &length, NULL); break; } case 0x08: { GoHome gohome={NO8}; fState = WriteFile(m_hCom, (void*)&gohome, sizeof(gohome), &length, NULL); break; } } if(!fState) { dwError=GetLastError(); goto rewrite; } else { if(code==0x08) { delete Write; delete Read; tagFile.Close(); CloseHandle(m_hCom); m_hCom = NULL; } } SetEvent(hEventRead); } return 0; } UINT ThreadRead(LPVOID pParam) { while(1) { WaitForSingleObject(hEventRead,INFINITE); fState = ReadFile(m_hCom, gReadBuf, 6, &length, NULL); if(!fState) { dwError=GetLastError(); AfxMessageBox("读取设备返回信息失败!"); } } SetEvent(hEventWrite); return 0; } |
|
沙发#
发布于:2007-02-25 10:09
建议最好写串口和读串口放在两个进程中..
缓存区放1024够你写了后再读的 这样比较保险,串口下多线程工作是有点问题 |
|
板凳#
发布于:2007-03-05 14:09
问题的产生和线程/进程无关,是你的WaitForSingleObject用法有问题,在你等待时间触发之前,要先重置时间,ResetEvent。请参考MSDN中的例子代码。在你加了重置事件的操作后,这里会有一个鸡生蛋蛋孵鸡的问题,你两个线程都在等待事件触发的情况下,需要在某个地方(比如主线程中)主动触发某个事件(READ or WRITE),否则就产生死锁。
|
|
地板#
发布于:2007-03-14 12:10
我实现的项目里,根本不用ResetEvent
发送命令 writeport,马上进入readport,直到把端口缓冲中的数据读完;分析得到的返回数据包,分析完数据包后再writeport 这种实现方法简单实用可靠,在加上Timer控制循环,可以很好的实现对终端设备数据的循环采集。 已经经实际案例检验。 |
|
地下室#
发布于:2007-04-27 22:38
这个我也遇到过,主要是资源的占用问题,只要分配我资源的占用,就可以解决这个问题
|
|