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