【问题标题】:Com port write read methodologyCom 端口写读方法
【发布时间】:2015-05-29 11:44:03
【问题描述】:

我正在与 Wince 6.0 嵌入式设备通信并通过 c/c++ 代码读取/写入一些数据。现在我使用下面的代码 sn-ps 来读/写 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 端口?我在移位方面做得正确吗?我在 web 上找到了 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;
}

【问题讨论】:

  • 位移是正确的。我可以建议的是测试你的系统的无字节序,因为你的 Wince 和你的平台可以有不同的无字节序。
  • @LPs:你能告诉我如何检查字节序吗?
  • @hyphenu 看看HERE
  • @LPs:感谢您的链接。我用一些简单的代码进行了验证。它应该是小端格式。还有一件事,我在 Windows 7 PC 和 Win CE 6.0 上都尝试了相同的代码。结果是一样的。是因为 Intel x86 架构吗?
  • 当然。字节顺序取决于硬件。

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


【解决方案1】:

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

长答案:

上面的代码不依赖任何强制转换;它使用的所有操作都是与字节序无关的操作(例如,i>>8 的数字结果始终与字节序无关,并且 >> 通常与任何其他算术或按位运算一样,与字节序无关),所以它将在任何平台上产生相同的结果,无论是 little-endian 还是 big-endian。

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

【讨论】:

  • 这取决于设备的预期,Wince 不起作用。需要大端顺序的设备比大端操作系统更常见:)
  • 是的。我发布的代码是大端类型的。我发现我的平台即WinCE是little-endian后将其更改为little-endian。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-21
  • 1970-01-01
  • 2013-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多