Com端口写读方法

Com port write read methodology

本文关键字:方法 Com      更新时间:2023-10-16

我正在与一个Wince 6.0嵌入式设备通信,并通过c/c++代码读写一些数据。现在我使用下面的代码片段读/写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到字节转换的代码,我在位/字节操作方面不是很强。

更新

当我知道我的平台是little-endian后,我将字节转换的例程更改为如下。有人能证实一下吗?

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()看起来不错,但是不管它运行的平台是小端还是大端,它都会在"在线上"产生大端字节数。如果这种"大端在线"是您所需要的,则取决于目标设备/协议要求。

长答:

上面的代码不依赖于任何类型转换;它使用的所有操作都是与端序无关的操作(例如,i>>8的数值结果总是相同的,而>>通常与任何其他算术或位操作一样是与端序无关的),因此它将在任何平台上产生相同的结果,无论是小端序还是大端序。

由于代码的编写方式,即使在小端系统上运行,它也会"在线"产生大端序。所以,剩下的问题是"目标设备到底期望什么——大端序还是小端序"。如果目标设备期望使用小端序,那么代码应该重写为:

ucRawBuffer[iOffset] = (iValue & 0xFF);
ucRawBuffer[iOffset+1] = ((iValue >> 8) & 0xFF);
ucRawBuffer[iOffset+2] = ((iValue >> 16) & 0xFF);
ucRawBuffer[iOffset+3]   = ((iValue >> 24) & 0xFF);