串口通信中,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。




原文地址:https://www.cnblogs.com/chengkeke/p/5417384.html