Qt中串口通信,十六进制进制转换问题

在与串口通信时,我需要给串口发送指定报文格式的命令,在接收到串口返回的数据后需要转换成浮点数并且显示出来。这里讲一下我自己碰到的问题,以及我发现的解决方法,如果大家有更好的方法可以在下方留言一起讨论。

为了模拟真实的串口通信环境,我这里是用自己写的软件和在网上下载的串口助手进行数据交互。由串口助手发送"42F6CCCD",在自己写的窗口中转换成浮点数并显示。然而本应该显示"123.4",但是显示出来却变成"6.27543e-41",显然肯定是有问题的。

    QByteArray strhex = my_serialport->readAll();
    qDebug()<<strhex;
    //输出"B\xF6\xCC\xCD"

经过排查我发现如果将读取的数据直接打印出来会输出"B\xF6\xCC\xCD",然后按照Qt中十六进制的表示方法应该是"x42\xF6\xCC\xCD"。
我尝试输入不同的数据,发现当高位字节为"2~6"时打印出来的数据就会出错,但是在网上也没有找到类似的问题,于是换了一种思路,将读取的数据按字节转换为十六进制。

这里先放出在网上找到的十六进制转换的函数:

char MainWindow::ConvertHexChar(char ch)//十六进制转换工具
{
   
    if((ch >= '0') && (ch <= '9'))
        return ch-0x30;
    else 
### Qt处理接收到的十六进制00值的方法 当使用Qt通过串口通信时,遇到接收十六进制`0x00`(即空字符)的情况,通常会发现这些字节未能正常显示或被忽略。为了确保能够正确处理并展示所有的数据,包括那些具有特殊意义的零值,建议采取以下措施: #### 设置正确的读取模式 对于串口类中的readyRead信号连接槽函数,在该槽内实现对传入数据流的有效解析。由于默认情况下QString可能无法很好地表示二进制序列特别是其中含有NULL终止符(`\0`)的情形,因此推荐直接操作QByteArray对象来保存原始字节数组。 ```cpp void SerialPortReader::readData() { QByteArray data = serial->readAll(); // 处理data... } ``` 此方式下,即使存在多个连续的`\x00`也不会影响程序逻辑[^1]。 #### 数据可视化 如果希望在界面上直观呈现所有接收到的内容,则需考虑如何将非可打印字符合理映射成可见形式。一种常见做法是在转换为字符串之前先遍历整个数组,把每一个不可见字符替换成特定标记如`.`或其他易于辨识符号;而对于正常的ASCII范围内的字母数字则保持不变。 ```cpp QString byteArrayToVisibleString(const QByteArray& bytes) { QString result; foreach (char ch, bytes) { if ((ch >= 32 && ch <= 126)) { // 可视化ASCII字符 result.append(ch); } else { result.append('.'); // 非可视化的占位符 } } return result; } // 或者更简洁的方式利用lambda表达式配合std::transform算法: #include<algorithm> QString byteArrayToVisibleStringLambda(const QByteArray& bytes){ QString visibleStr(bytes.size(), '.'); std::transform(bytes.begin(), bytes.end(), visibleStr.begin(), [](unsigned char c){return isprint(c)?c:'.';}); return visibleStr; } ``` 上述代码片段展示了两种不同的方法用于创建一个只包含可打印字符的新字符串实例,从而使得任何输入都能得到恰当的表现[^2]。 另外值得注意的是,针对某些应用场景而言,除了简单的替换外还可能存在其他需求比如记录实际数值以便后续分析等,这时可以根据具体业务场景灵活调整策略。 #### 编码设置 考虑到不同平台间编码差异可能导致的问题,务必确认应用程序内部以及外部接口所使用的字符集一致。例如,在Windows环境下开发时可以通过修改控制台输出代码页等方式避免可能出现的乱码现象[^3]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值