Com端口写入读取方法

时间:2015-05-29 11:44:04

标签: c++ c serial-port windows-ce

我正在与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到字节转换的代码,我在位/字节操作方面不是很强。

更新

在我知道我的平台是小端之后,我将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;
}

1 个答案:

答案 0 :(得分:1)

简短回答:ConvertIntToByte()看起来没问题,但无论运行的平台是小端还是大端,它都会产生“线上”的大端。如果这个“电线上的大端”是您所需要的 - 取决于目标设备/协议要求。

答案很长:

上面的代码不依赖于任何演员阵容;它使用的所有操作都是与字节顺序无关的操作(例如,无论字节顺序如何,i>> 8的数字结果总是相同的,并且>>通常与字节顺序无关,与任何其他算术或按位运算一样) ,因此它将在任何平台上产生相同的结果,无论是小端还是大端。

由于编写代码的方式,即使在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);