lijianjun714
驱动小牛
驱动小牛
  • 注册日期2006-08-24
  • 最后登录2009-09-24
  • 粉丝0
  • 关注0
  • 积分23分
  • 威望349点
  • 贡献值0点
  • 好评度162点
  • 原创分0分
  • 专家分0分
阅读:2029回复:4

多线程串口通讯问题

楼主#
更多 发布于:2007-02-03 10:31
  我做了两个读写串口的线程,目的是先写串口,然后从串口读数据,然后再写再读,一直下去。为什么我们调试的时候写线程完毕,再读一次的时候程序就不走了呀!我的代码如下:

  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;
}
samfang
驱动牛犊
驱动牛犊
  • 注册日期2007-02-02
  • 最后登录2008-05-25
  • 粉丝0
  • 关注0
  • 积分200分
  • 威望21点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-02-25 10:09
建议最好写串口和读串口放在两个进程中..
缓存区放1024够你写了后再读的
这样比较保险,串口下多线程工作是有点问题
ytwei
驱动小牛
驱动小牛
  • 注册日期2005-04-01
  • 最后登录2010-07-30
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望102点
  • 贡献值0点
  • 好评度85点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-03-05 14:09
问题的产生和线程/进程无关,是你的WaitForSingleObject用法有问题,在你等待时间触发之前,要先重置时间,ResetEvent。请参考MSDN中的例子代码。在你加了重置事件的操作后,这里会有一个鸡生蛋蛋孵鸡的问题,你两个线程都在等待事件触发的情况下,需要在某个地方(比如主线程中)主动触发某个事件(READ or WRITE),否则就产生死锁。
samfang
驱动牛犊
驱动牛犊
  • 注册日期2007-02-02
  • 最后登录2008-05-25
  • 粉丝0
  • 关注0
  • 积分200分
  • 威望21点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-03-14 12:10
我实现的项目里,根本不用ResetEvent

发送命令 writeport,马上进入readport,直到把端口缓冲中的数据读完;分析得到的返回数据包,分析完数据包后再writeport

这种实现方法简单实用可靠,在加上Timer控制循环,可以很好的实现对终端设备数据的循环采集。

已经经实际案例检验。
reludson
驱动牛犊
驱动牛犊
  • 注册日期2004-01-29
  • 最后登录2014-06-22
  • 粉丝1
  • 关注0
  • 积分25分
  • 威望209点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分1分
地下室#
发布于:2007-04-27 22:38
这个我也遇到过,主要是资源的占用问题,只要分配我资源的占用,就可以解决这个问题
游客

返回顶部