源代码地址:https://github.com/zhaixd123/Qt.git
先上个截图吧- -
win10下运行
ubuntu18.04下运行
串口使用的QT官方提供的QtSerialPort
使用QtSerialPort要在项目的.pro文件中引入下面的代码
QT += serialport
然后用到QtSerialPort的地方引入头文件
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
字符编码暂时只支持了utf-8和gbk,如果需要更多可以下载源代码自行添加。
然后讲一下调试过程中遇到的一些问题吧。
第一个就是槽函数触发,QT应该是缓冲区有数据就触发,如果数据比较长就会造成多次进入槽函数,然后读了其中一部分,剩下的一部分再次触发槽函数。解决办法呢,我所了解到的有两种
- 触发槽函数后开启一个死循环,读取指定时长后,关闭死循环,在这个死循环内把接收的数据 拼接在本次采样初次触发接收到的数据后面。但这会带来一个问题,如果发送数据方发送的频率特别密集,超过了我们设置的死循环的采样时间,这个时候就有可能粘包。
- 使用断行符,即直到接收到某个字符或字符串才判断为接收到了完整的一行,然后从中截取出该断行符前的数据拼接在一起视为完整的一行,细节看源代码。
第二个就是发送编码问题,就是将字符串转换为指定编码格式的QByteArray,接收编码在网上可以找到一大堆,这里就不赘述了,下面贴上发送编码转换代码
QString sendStr=te_Send->toPlainText(); //获取要发送的内容
QByteArray sendByteArray; //字符串转换为QByteArray
QString encodStr=cbx_SendEncoding->currentText(); //获取编码格式
QTextCodec *qCodec; //编码转换实例
qCodec=QTextCodec::codecForName(encodStr.toLatin1()); //设置编码格式
sendByteArray=qCodec->fromUnicode(sendStr); //转换