Com端口写读方法
Com port write read methodology
我正在与一个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);
相关文章:
- 获取从 C# 调用的 COM 方法的错误消息
- 将 COM 事件从 C# 触发到C++的正确方法是什么?
- com 释放方法不降至0
- C com 方法参数扣除
- 为什么我的COM智能指针从方法返回时会被删除
- 当从一个应用程序调用时,在DLL方法中创建COM接口指针是有效的,但当从另一个应用软件调用时则无效
- 如何在 JavaScript 代码中调用 COM 方法 (c++)
- 在 .NET 中调用 COM 枚举器的正确方法是什么?
- 删除/编辑 ATL COM DLL 属性/方法
- 当输出参数是类时,如何在C++中调用COM方法
- 可视化 如何删除 ATL COM C++中的方法
- 是否有手动组织COM封送处理的方法
- 使用本机/C++代码在VS2010中创建简单COM对象的最简单方法是什么
- 如何在 COM 中对方法执行返回类型
- COM属性方法和常规接口方法之间的区别是什么
- 初始化COM C++服务多线程的正确方法
- #导入COM DLL生成错误的方法签名
- COM / DCOM:服务器存根不会为现有接口中的新方法分配内存
- COM 方法仅在使用暂停间隔调用时返回正确的值
- COM:始终需要方法参数属性