找回密码
 立即注册
收起左侧

QT 编码转换 QByteArray至QString乱码

6
回复
846
查看
[复制链接]
累计签到:1 天
连续签到:1 天
来源: 2019-1-8 18:16:32 显示全部楼层 |阅读模式
1Qter豆
已知QByteArray接收编码为/xCE/xD2/xCA/xC7/xD6...........(接收正确);
已知对方发送为: ("我是中国人"); 16进制码为: CE D2 CA C7 D6 D0 B9 FA C8 CB ;
==================================;
已知编译环境为: UTF-8编码; VS IDE +QT;
==================================;
故QString至TextEdit显示, 须定义->setText(qstr.toUtf8()); 显示正常;
==================================;
但现在从QByteArray至QString乱码,故增加QString xxx = QString::fromLocal8Bit(QByteArray)转码, 但现在只能部分显示正确(80%), 所以来请教大神, 下面为代码处:
====================================;
void QSerialPort_COM::slotReceiveEvent() //接收数据事件
{
int len = serialPort->bytesAvailable(); //接收长度
if (len > 0)
{
QByteArray arrayBuf = serialPort->readAll(); //读取所有字节
//qDebug() << "++++++++++++++++\r\n" << arrayBuf;
//QString buf = arrayBuf;
//QString buf = QString(arrayBuf);
QString buf = QString::fromLocal8Bit(arrayBuf);
//qDebug() << "++++++++++++++++\r\n" << buf;
if (!arrayBuf.isEmpty())
{
if (ui.checkBox_rxHEX->isChecked())ui.textEdit_receive->insertPlainText(arrayBuf.toHex()); //添加文本
else ui.textEdit_receive->insertPlainText(buf.toUtf8()); //添加文本
ui.textEdit_receive->moveCursor(QTextCursor::End); //文本光标移至最底部
}
}
}

回复

使用道具 举报

累计签到:1 天
连续签到:1 天
2019-1-8 18:20:02 显示全部楼层
本帖最后由 wlq19911021 于 2019-1-8 18:22 编辑

经测试, 乱码处为, 接收数据头尾乱码, 串口一次接收量较小(2-20字节), 发送段自动产生 ,所以乱码很严重

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

累计签到:41 天
连续签到:1 天
2019-1-8 21:04:08 显示全部楼层
本帖最后由 baizy77 于 2019-1-8 21:05 编辑

QByteArray arrayBuf = serialPort->readAll(); //读取所有字节
您确认这样能一次读取所有对方发来的数据吗?建议在发送时进行组帧,接收时解帧。给数据加上报头、长度、校验码等通信常用的结构。
接收时对这些内容依次判断。完全通过验证的数据才能进行展示。
回复

使用道具 举报

累计签到:1 天
连续签到:1 天
2019-1-9 00:40:43 显示全部楼层
baizy77 发表于 2019-1-8 21:04
QByteArray arrayBuf = serialPort->readAll(); //读取所有字节
您确认这样能一次读取所有对方发来的数据吗 ...

那有什么用, 我要做的是串口助手, 要高速显示

点评

这能保证你收到完整的数据后再显示。不影响是否高速显示。使用报头、长度等设计是基本的通信设计原则。直接读取串口无法保证一次收集全部的发送数据,只能保证读取到现在串口中收到的数据,而这些未必是您期望的全部  详情 回复 发表于 2019-1-9 10:49
回复

使用道具 举报

累计签到:41 天
连续签到:1 天
2019-1-9 10:49:09 显示全部楼层
wlq19911021 发表于 2019-1-9 00:40
那有什么用, 我要做的是串口助手, 要高速显示

这能保证你收到完整的数据后再显示。不影响是否高速显示。使用报头、长度等设计是基本的通信设计原则。直接读取串口无法保证一次收集全部的发送数据,只能保证读取到现在串口中收到的数据,而这些未必是您期望的全部数据。
回复

使用道具 举报

累计签到:1 天
连续签到:1 天
2019-1-9 22:37:06 显示全部楼层
baizy77 发表于 2019-1-9 10:49
这能保证你收到完整的数据后再显示。不影响是否高速显示。使用报头、长度等设计是基本的通信设计原则。直 ...

串口就是要实时显示, 1M字节以上的速度, 你确信不在底层,用的不是CPU周期能处理得过来
回复

使用道具 举报

累计签到:1 天
连续签到:1 天
2019-1-9 22:38:47 显示全部楼层
baizy77 发表于 2019-1-9 10:49
这能保证你收到完整的数据后再显示。不影响是否高速显示。使用报头、长度等设计是基本的通信设计原则。直 ...

C++运行在.Net之上, 处理数据也得是面对对象法, 而不是常规数据处理手段
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册