首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

读串口线程有关问题,

2012-01-24 
读串口线程问题,在线等。这几天一直在看别人的一个系统,是有关串口通讯的。他的程序里有一个接收串口数据的

读串口线程问题,在线等。
这几天一直在看别人的一个系统,是有关串口通讯的。
他的程序里有一个接收串口数据的线程,可是我发现当有数据到串口时,它又并没有接收到数据,看了很久,不知道到里是不是它程序的问题还是怎么了,请高手们帮忙看看。
程序初始化端口后就函用了下面创建线程函数:
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查看缓冲中的字节数,然后接收
[解决办法]
呵呵,最后自己能找到问题所在,还是很不错的,学习一下,顺道也来拿些分。

热点排行