Com口写读方法
Com port write read methodology
我正在通过 c/c++ 代码与 Wince 6.0 嵌入式设备和 read/write 一些数据通信。现在我正在使用下面的代码片段 read/write 到 com 端口。
void ConvertIntToByte(int iValue, BYTE* ucRawBuffer, int iOffset)
{
ucRawBuffer[iOffset] = ((iValue >> 24) & 0xFF);
ucRawBuffer[iOffset+1] = ((iValue >> 16) & 0xFF);
ucRawBuffer[iOffset+2] = ((iValue >> 8) & 0xFF);
ucRawBuffer[iOffset+3] = (iValue & 0xFF);
}
ReadWriteDataThread()
{
BYTE ucInitMsg[32] = {0};
ucInitMsg[0] = 0x0A;
ConvertIntToByte(iUTCTime, ucInitMsg, 1);
ucInitMsg[21] = 0x02;
ucInitMsg[22] = 0x3E;
ucInitMsg[31] = 0xCA;
m_objComm.WriteCommPort(ucInitMsg, 32); //Its a standard comm port write function which used WriteFile windows API
}
现在,我担心的是我是否以正确的方式将字节写入 com 端口?我在位移方面做得对吗?我在网上找到了 int 到 byte 转换的代码,但我在 bit/byte 操作方面不是很擅长。
更新
知道我的平台是小端后,我把我的Byte转换的套路改成下面的样子。谁能验证一下?
void ConvertIntToByte(int iValue, BYTE* ucRawBuffer, int iOffset)
{
ucRawBuffer[iOffset] = iValue & 0xFF;
ucRawBuffer[iOffset+1] = (iValue >> 8) & 0xFF;
ucRawBuffer[iOffset+2] = (iValue >> 16) & 0xFF;
ucRawBuffer[iOffset+3] = (iValue >> 24) & 0xFF;
}
void ConvertShortToByte(short iValue, BYTE* ucRawBuffer, int iOffset)
{
ucRawBuffer[iOffset] = iValue & 0xFF;
ucRawBuffer[iOffset+1] = (iValue >> 8) & 0xFF;
}
简短回答:ConvertIntToByte() 看起来不错,但它会产生大端 "on the wire" 无论它运行的平台是小端还是大端。如果此 "big-endian on the wire" 是您所需要的 - 取决于目标 device/protocol 要求。
长答案:
上面的代码不依赖于任何转换;它使用的所有操作都是与字节顺序无关的操作(例如,无论字节顺序如何,i>>8 的数字结果始终相同,并且 >> 通常与任何其他算术或按位操作一样是字节顺序不可知的),因此它将在任何平台上产生相同的结果,无论是小端还是大端。
由于代码的编写方式,即使在小端系统上运行,它也会产生大端"on the wire"。所以,剩下的问题就是"what exactly target device expects - big-endian or little-endian"。如果目标设备需要 little-endian,则代码应重写为:
ucRawBuffer[iOffset] = (iValue & 0xFF);
ucRawBuffer[iOffset+1] = ((iValue >> 8) & 0xFF);
ucRawBuffer[iOffset+2] = ((iValue >> 16) & 0xFF);
ucRawBuffer[iOffset+3] = ((iValue >> 24) & 0xFF);
我正在通过 c/c++ 代码与 Wince 6.0 嵌入式设备和 read/write 一些数据通信。现在我正在使用下面的代码片段 read/write 到 com 端口。
void ConvertIntToByte(int iValue, BYTE* ucRawBuffer, int iOffset)
{
ucRawBuffer[iOffset] = ((iValue >> 24) & 0xFF);
ucRawBuffer[iOffset+1] = ((iValue >> 16) & 0xFF);
ucRawBuffer[iOffset+2] = ((iValue >> 8) & 0xFF);
ucRawBuffer[iOffset+3] = (iValue & 0xFF);
}
ReadWriteDataThread()
{
BYTE ucInitMsg[32] = {0};
ucInitMsg[0] = 0x0A;
ConvertIntToByte(iUTCTime, ucInitMsg, 1);
ucInitMsg[21] = 0x02;
ucInitMsg[22] = 0x3E;
ucInitMsg[31] = 0xCA;
m_objComm.WriteCommPort(ucInitMsg, 32); //Its a standard comm port write function which used WriteFile windows API
}
现在,我担心的是我是否以正确的方式将字节写入 com 端口?我在位移方面做得对吗?我在网上找到了 int 到 byte 转换的代码,但我在 bit/byte 操作方面不是很擅长。
更新
知道我的平台是小端后,我把我的Byte转换的套路改成下面的样子。谁能验证一下?
void ConvertIntToByte(int iValue, BYTE* ucRawBuffer, int iOffset)
{
ucRawBuffer[iOffset] = iValue & 0xFF;
ucRawBuffer[iOffset+1] = (iValue >> 8) & 0xFF;
ucRawBuffer[iOffset+2] = (iValue >> 16) & 0xFF;
ucRawBuffer[iOffset+3] = (iValue >> 24) & 0xFF;
}
void ConvertShortToByte(short iValue, BYTE* ucRawBuffer, int iOffset)
{
ucRawBuffer[iOffset] = iValue & 0xFF;
ucRawBuffer[iOffset+1] = (iValue >> 8) & 0xFF;
}
简短回答:ConvertIntToByte() 看起来不错,但它会产生大端 "on the wire" 无论它运行的平台是小端还是大端。如果此 "big-endian on the wire" 是您所需要的 - 取决于目标 device/protocol 要求。
长答案:
上面的代码不依赖于任何转换;它使用的所有操作都是与字节顺序无关的操作(例如,无论字节顺序如何,i>>8 的数字结果始终相同,并且 >> 通常与任何其他算术或按位操作一样是字节顺序不可知的),因此它将在任何平台上产生相同的结果,无论是小端还是大端。
由于代码的编写方式,即使在小端系统上运行,它也会产生大端"on the wire"。所以,剩下的问题就是"what exactly target device expects - big-endian or little-endian"。如果目标设备需要 little-endian,则代码应重写为:
ucRawBuffer[iOffset] = (iValue & 0xFF);
ucRawBuffer[iOffset+1] = ((iValue >> 8) & 0xFF);
ucRawBuffer[iOffset+2] = ((iValue >> 16) & 0xFF);
ucRawBuffer[iOffset+3] = ((iValue >> 24) & 0xFF);