专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > C++ Builder

MSComm通信,该怎么解决

发布时间:2011-06-28 12:18:01 文章来源:www.iduyao.cn 采编人员:星星草
MSComm通信
我在做串口通信时 用的是控件MSComm 定义了一个全局变量 number 在一个timer当中响应事件做number++;number=1时发送一串命令 依次类推,但是我发现当我的设备没开的时候 依然在发送,我想当设备没打开的时候不发送命令,接收是在oncomm当中响应的 ,
  byte buff[30];
  int ByteNum;
  OleVariant RxBuff;
  if(MSComm1->CommEvent==comEvReceive)
  {
  if(MSComm1->InBufferCount>0)
  {
  RxBuff=MSComm1->Input;
  ByteNum=RxBuff.ArrayHighBound();
  for(int i=0;i<=ByteNum;i++)
  buff[i]=RxBuff.GetElement(i);
  }
  }
else 
  ShowMessage(....);

但是这样的话 我一运行程序就弹出message内容 请问有其他什么办法吗?

------解决方案--------------------
呵呵这是的主线程代码,你参考下:
HANDLE m_Comm,m_CommThread ;
m_Comm = CreateFile(sPort, GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
m_CommThread = CreateThread(NULL, 1024, CommThread, this, 0, &ThreadID);
C/C++ code

unsigned long WINAPI TSerialPort::CommThread(LPVOID Param)
{
    TSerialPort *Port = (TSerialPort *)Param;
    if (NULL == Port)
    {
        ExitThread(0);
    }

    if (INVALID_HANDLE_VALUE == Port->m_Comm)
    {
        ExitThread(0);
    }

    Port->m_ThreadAlive = true;

    unsigned long Event = 0;
    unsigned long CommEvent = 0;
    unsigned long Error = 0;
    COMSTAT Comstate;
    bool Result = true;    

    PurgeComm(Port->m_Comm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);
    while(1)
    {
        Result = WaitCommEvent(Port->m_Comm, &Event, &Port->m_Overlapped);
        if (Result)
        {
            Result = ClearCommError(Port->m_Comm, &Error, &Comstate);
            if (Comstate.cbInQue == 0)
            {
                continue;
            }
        }
        else
        {
             GetLastError();
        }

        Event = WaitForMultipleObjects(3, Port->m_EventArray, false, INFINITE);
        switch(Event)
        {
        case 0:
            Port->m_ThreadAlive = false;
            ExitThread(0);
            break;
        case 1:
            GetCommMask(Port->m_Comm, &CommEvent);
            if (CommEvent & EV_RXCHAR)
            {
                ReceiveChar(Port, Comstate);
            }
            break;
        case 2:
            SendChar(Port);
            break;
        }
    }
    return 0;
}

------解决方案--------------------
你的代码使用使用Timer监视MSComm串口组件,当没有接受到数据的时候弹出MessageBox,实际上串口多数时候是没有数据的,那么你的Timer当然会不停的弹出对话框,这里的else应取消掉。

另外,你的代码存在严重的问题,由于MSComm串口接收事件响应机制是接收到1个字符也触发,那么也就意味着如果你的串口接收到数据会分成好几次接收,比如15个字符可能会分成8,6,1三次接收,那么你的串口指令可能就不完整。这种现象在使用计算机几个串口互相通信的时候不太明显,但是一旦接入单片机或其他仪表就很容易发生。
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: