读书人

MSComm通信,该怎么解决

发布时间: 2012-05-03 14:06:56 作者: rapoo

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三次接收,那么你的串口指令可能就不完整。这种现象在使用计算机几个串口互相通信的时候不太明显,但是一旦接入单片机或其他仪表就很容易发生。

读书人网 >C++ Builder

热点推荐