Qt 写一个跨平台串口Demo,以及解决串口接收不完整的问题!

源代码地址: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应该是缓冲区有数据就触发,如果数据比较长就会造成多次进入槽函数,然后读了其中一部分,剩下的一部分再次触发槽函数。解决办法呢,我所了解到的有两种

  1. 触发槽函数后开启一个死循环,读取指定时长后,关闭死循环,在这个死循环内把接收的数据 拼接在本次采样初次触发接收到的数据后面。但这会带来一个问题,如果发送数据方发送的频率特别密集,超过了我们设置的死循环的采样时间,这个时候就有可能粘包。
  2. 使用断行符,即直到接收到某个字符或字符串才判断为接收到了完整的一行,然后从中截取出该断行符前的数据拼接在一起视为完整的一行,细节看源代码。

第二个就是发送编码问题,就是将字符串转换为指定编码格式的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);     //转换
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

x县豆瓣酱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值