C++ Windows串口代码如何修改以支持发送0x00~0xFF字节并解决编译报错
问题根源
- Visual Studio默认
char为带符号类型,取值范围是-128~127,直接给char类型变量赋值0x80(128)、0xFF(255)超出了取值范围,所以触发窄化转换、截断值的警告,你的工程开了警告视为错误,所以编译失败。 std::string是std::basic_string<char>的别名,它的构造函数只接受const char*类型的指针,uint8_t在VS里等价于unsigned char,二者是不同类型,直接传const uint8_t*给std::string构造函数找不到匹配的重载,所以队列emplace时报错。
解决方案
优先推荐改动最小的方案:
方案1:不修改现有SendMsg逻辑,仅解决char数组初始化警告
只需要给初始化的数值强转char类型即可,内存中存储的二进制值和你预期的完全一致,不影响串口发送结果:
char hexBytes[2] = { (char)0x80, (char)0xFF }; mySerialLinkObject->SendMsg(hexBytes, 2);
这个方案完全不需要修改原有封装逻辑,对现有代码影响最小。
方案2:保留uint8_t数组的写法
如果希望用无符号类型更明确表达字节语义,不需要重载SendMsg,传参时做一次指针类型转换即可:
uint8_t hexBytes[2] = { 0x80, 0xFF }; mySerialLinkObject->SendMsg(reinterpret_cast<const char*>(hexBytes), 2);
方案3:修复你写的SendMsg重载实现
如果确实需要保留const uint8_t*参数的重载,只需要在构造std::string时做指针类型转换即可:
SendMsg(const uint8_t* dataBuff, unsigned int dataBuffSz) { m_queue.emplace(reinterpret_cast<const char*>(dataBuff), dataBuffSz); }
补充说明
原有代码用std::queue<std::string>存储待发数据是非常常见的字节缓冲区用法,std::string在这里仅用来持有连续的二进制字节内存,和存储文本的语义无关,只要内存字节值正确,串口发送的结果就完全符合预期。
内容的提问来源于stack exchange,提问作者jt1995SCO
相关产品推荐
相关产品推荐

