• 串口通信中,QString 、QByteArray 转化需要注意的问题


        在做串口通信的时候,其中犯了一个错误。在此记录一下:QT中串口通信接到收据和发送数据的接口如下:
    1. QByteArray QIODevice::readAll()//接受数据
    2. qint64 QIODevice::write(const QByteArray & byteArray)//写入数据
    接受数据和发送数据都是以 字节数组为单位的。我在ini文件存储了指令串:“01 16 7B 28 48 45 32 30 31 34 31 31 39 35 67 61 29 7D 7E 04” ,读取INI文件后,返回值为一个QVariant类型,转到QByteArray后发生错误。因为这样的转换,把QVaraint中所有的字符都当成了一个字节。例如'01'被当做'0'、‘1’,后面依次类推。当我们调用wirte函数时,因为不能正确传递我们要发送的指令串,因此modBus网络不能正常通信。因此,我们要让'01'成为一个字节,解决的办法,利用‘,’号把每一个字节隔开,存入ini文件。当用settings读取该文件时,把读取到的值转换为StringList。在用StringLIst这个字节链表,遍历后,把每个字节存入到QByteArray。

        在此要注意的一点是,当我们把“01 16 7B 28 48 45 32 30 31 34 31 31 39 35 67 61 29 7D 7E 04” 存入QByteArray是,虽然调试时看见的是其ASCII字符,但是当写入串口后,其ASCII码是固定的(每个字符为一个固定的7位二进制序列)。我们无需关心把16进制存入Byte/char时,在传递的时候发生错误。因为传递的时候,通信网络都会把ASCII字符转换为对应的ASCII码。
        思考,我想ASCII字符应该只是显示的时候出现,而char (字符型)对应数据的本质应该为一个二进制码。严格来说char其实也是一个整数类型,因为char实质上存储的是一个整数,而不是字符。比如char a = 'A'; a其实存储的是65。




  • 相关阅读:
    新IO建立的聊天程序
    “万能数据库查询分析器”在四大软件下载网站的排行榜中均入围前10,可喜可贺
    命令行界面的C/S聊天室应用 (Socket多线程实现)
    URL 多线程下载
    DB 查询分析器 6.03 如何灵活、快捷地操作国产达梦数据库
    DB 查询分析器 6.03 在Windows 8 上安装与运行演示
    Maven部署项目到Tomcat
    中文版Maya基础培训教程
    Arduino技术指南
    Photoshop 淘宝店面设计从入门到精通
  • 原文地址:https://www.cnblogs.com/chengkeke/p/5417384.html
Copyright © 2020-2023  润新知