读串口线程问题,在线等。
这几天一直在看别人的一个系统,是有关串口通讯的。
他的程序里有一个接收串口数据的线程,可是我发现当有数据到串口时,它又并没有接收到数据,看了很久,不知道到里是不是它程序的问题还是怎么了,请高手们帮忙看看。
程序初始化端口后就函用了下面创建线程函数:
m_hReceiver=CreateThread(NULL,0,ComClientReceiver,this,0,NULL);
创建了一个接收(读)串口数据的线程;
线程函数定义如下:
DWORD WINAPI CComClient::ComClientReceiver(LPVOID lpParameter)
{
CComClient *pComClient;
pComClient = (CComClient *)lpParameter;
while(TRUE)
{
BYTE sBuffer[8];
if(pComClient-> ReceiveBuffer(sBuffer,1))
{
SendMessage(pComClient-> m_hParentWnd,CM_NEW_BYTE,sBuffer[0],NULL);
AfxMessageBox(sBuffer[0]);
}
}
其中在该线程函数中调用的ReceiveBuffer(sBuffer,1)定义如下:
BOOL CComClient::ReceiveBuffer(LPBYTE lpBuffer, WORD nSize)
{
DWORD iCount;
if (m_hCom!=INVALID_HANDLE_VALUE)
{
ReadFile(m_hCom, lpBuffer, nSize, &iCount, NULL);
return nSize==iCount; //接收是否成功
}
else
{
return FALSE; //接收失败
}
}
我看了很久,对这断代码不明白。而且程序运行也接收不到数据。
它在ComClientReceiver(LPVOID lpParameter)函数中,用一个while(TRUE)
不停的循环测试数据到来。感觉这种方法也不太好,并没有用到事件驱动,希望有高手能帮忙分析这短代码。它到里能不能成功接收数据。谢谢!
还有,我再问一下,我们读串口数据时,到里怎么读,我在网上查了一下,有人说要一个字节一个字节的从串口处读数据,我就不太明白,假如对方通过串口发送一串数据过来,数据比较多,比如可能有一百个字节,我们是不是也要从串口处读一百次,每次读一个字节,才能把这一串数据读出来呢?
[解决办法]
这里读取串口数据的代码没有问题!
关键是在启动这个线程的时候,是否打开了串口!
串口接收确实是一个一个字节进行接收的,但是这不是我们做的事情,而是硬件做的事情,它接收后就存放在串口的缓冲区里面,我们所做的事情实际上是从串口缓冲区中读取数据上来.这个时候就可能不是一个字节的数据,而是一串数据
[解决办法]
串口是否成功打开
[解决办法]
我是用的MSComm控件作的。
串口接收是一个字节一个字节的,用m_MSComm.SetInBufferSize(8192); //设置接收缓冲区
先设置控件参数,然后打开串口,打开串口后,开始读:
m_MSComm.SetInputLen(0); //设置当前接收区数据长度为0
m_MSComm.GetInput();//先预读缓冲区以清除残留数据
至于一次读进来多少数据,用m_MSComm.SetRThreshold(31);来控制
没得到数据有可能是没打开串口,或者打开的1口读的2口,或者代码错了^_^
[解决办法]
解决办法:使用WaitEvent等待事件,取数之前GetCommState查看缓冲中的字节数,然后接收
[解决办法]
呵呵,最后自己能找到问题所在,还是很不错的,学习一下,顺道也来拿些分。