概述
在串口接收显示,经常会遇到中文显示乱码,而英文或数字不会乱码!原因即为分段显示造成的,由于一个中文字至少需要 2 个字节表示,只有 2 个字节组合在一起才能正确的显示中文。假设串口是分两段接收的,刚好这两个字节分别在这两段中,不能组成一个完整的中文字,便会造成显示乱码了,如下图所示。
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.更新后
更改后,效果如下图所示,在一段中完成了接收,无乱码情况发生。
3.小结
可以解决有间隔的发送数据显示乱码问题,连续发送的情况下,该方法不适用。