RYMCU

Qt5串口调试助手(11)--中文显示乱码

Hugh 4 年前
# 串口调试助手 # Qt5 # 中文显示乱码

概述

在串口接收显示,经常会遇到中文显示乱码,而英文或数字不会乱码!原因即为分段显示造成的,由于一个中文字至少需要 2 个字节表示,只有 2 个字节组合在一起才能正确的显示中文。假设串口是分两段接收的,刚好这两个字节分别在这两段中,不能组成一个完整的中文字,便会造成显示乱码了,如下图所示。

乱码.png

1.解决方法

既然是因为分段接收造成,那我们尽量让他们在一段里面被接收完成。一般情况下,串口数据都是一包一包的发,包与包之间是有一定间隔的,我们就利用这个间隔来尽量减少显示乱码。

我们前面讲过,当接收到串口数据后,直接进入数据集处理函数 MyComRevSlot(),进行数据处理,如下所示:

//串口接收函数关联
 connect(&MyCom,SIGNAL(readyRead()),this,SLOT(MyComRevSlot()));

如果,接收到数据先进入一个定时器延时函数,只有在指定时间内没有收到新的数据,我们再来处理前面接收到的所有数据。关联函数更改如下:

connect(&MyCom,SIGNAL(readyRead()),this,SLOT(portRecvDataDelay()));//串口数据接收过程:系统收到串口数据后,进入接收延时函数portRecvDataDelay(),
                                                                           //函数中停止定时器,再启动定时器,定时时间到了再进入接收处理函数MyComRevSlot()
                                                                           //因此,只有收到数据后,在连续的定时时间内都没有数据到了,才会进行数据处理,否则
                                                                           //一直在接收数据,这是为了解决收中文数据时,分段接收显示乱码问题。

延时处理函数,启动定时器,延时一段时间:

/***********************************************************
 * 串口接收数据延时
 * 1.串口收到数据后,先进入函数,重新启动延时定时器
 ***********************************************************/
void MainWindow::portRecvDataDelay()
{
    recvDelayTimer->stop();
    recvDelayTimer->start(50);//ms:延时时间按需选择
}

将数据处理函数与 MyComRevSlot()与延时定时器超时函数关联,当定时器超时到来时,才进行数据处理:

//接收延时到达,进行串口接收数据处理
connect(recvDelayTimer,SIGNAL(timeout()),this,SLOT(MyComRevSlot()));

2.更新后

更改后,效果如下图所示,在一段中完成了接收,无乱码情况发生。

正确显示.png

3.小结

可以解决有间隔的发送数据显示乱码问题,连续发送的情况下,该方法不适用。

后发布评论