【发布时间】: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