bool TCommThread::ReceiveChar(char Char)
{
// Modbus报文的第一个字符应当是':'
if(Char != 'p' && __RxBuffer.size() == 0)
return false;
// 将字符写入缓冲
__RxBuffer.push_back(Char);
// 如果收到的字符不是结束符,则退出
if(Char != '!')
{
if(__RxBuffer.size() > 10)
__RxBuffer.clear();
return false;
}
// 收到结束符,对报文加以解析处理
// 首先检查报文格式
if(__RxBuffer.size() != 10)
{
__RxBuffer.clear();
return false;
}
// 解析应答报文
if(__RxBuffer[1] == '1')
LPosition = CharToWord(RxBuffer, 3);
else if(__RxBuffer[1] == '2')
RPosition = CharToWord(RxBuffer, 3);
Synchronize(Form1->ShowStripPosition);
return true;
}
//------------------------------------------------------------------------------
// CharToHex()
//------------------------------------------------------------------------------
Byte TCommThread::CharToHex(char Char)
{
if(Char >= '0' && Char <= '9')
return Char - '0';
else if(Char >= 'A' && Char <= 'F')
return Char - 'A' + 10;
else if(Char >= 'a' && Char <= 'f')
return Char - 'a' + 10;
else
return 0;
}
//------------------------------------------------------------------------------
// CharToWord()
//------------------------------------------------------------------------------
Word TCommThread::CharToWord(vector &Buffer, unsigned int Begin)
{
return (CharToHex(Buffer[Begin]) << 12) |
(CharToHex(Buffer[Begin + 1]) << 8) |
(CharToHex(Buffer[Begin + 2]) << 4) |
CharToHex(Buffer[Begin + 3]);
}