QSerialPort的readyRead有时候会触发两次,偶发性的

sundynes 2019-05-21 03:20:08
我在用readyRead连接到槽函数后,槽函数响应第一次只读出来数据的一半,另一半在第二次接收到槽函数接收到,但是我写了一次数据,这种还是偶发性的,有时候不正常;有时候会正常的在第一次就读完数据,就不会有第二个readyRead信号了,不知道什么原因,那位大神了解呀!
m_serialPort = new QSerialPort(this);
//获取端口名称列表
m_portNameList = getPortNameList();

for (int i = 0; i < m_portNameList.length(); i++)
{
LogDebug(QString("匹配串口:%1").arg(i));
LogDebug(QString("串口名称:%1").arg(m_portNameList.at(i)));
//设置串口名字
m_serialPort->setPortName(m_portNameList.at(i));

//如果串口已经打开了 先给他关闭了
if (m_serialPort->isOpen())
{
m_serialPort->clear();
m_serialPort->close();
}
//用ReadWrite 的模式尝试打开串口
if (!m_serialPort->open(QIODevice::ReadOnly))
{
LogDebug("打开失败!");
b_QRCodeDeviceAvailable = false;
//ui.pb_QRcode->setEnabled(false);
}
//如果串口可以被打开
else
{
LogDebug("串口打开成功!");

//设置串口属性
m_serialPort->setBaudRate(QSerialPort::Baud115200, QSerialPort::AllDirections);//设置波特率和读写方向
m_serialPort->setDataBits(QSerialPort::Data8); //数据位为8位
m_serialPort->setFlowControl(QSerialPort::NoFlowControl);//无流控制
m_serialPort->setParity(QSerialPort::NoParity); //无校验位
m_serialPort->setStopBits(QSerialPort::OneStop); //一位停止位
m_serialPort->clearError();
m_serialPort->clear();
b_QRCodeDeviceAvailable = true;

//绑定读取数据的入口
connect(m_serialPort, SIGNAL(readyRead()), this, SLOT(slot_receiveQRcodeInfo()));
//m_serialPort->write(QString("0x1b,0x32").toLatin1());
}
...全文
1873 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
sundynes 2019-05-29
  • 打赏
  • 举报
回复
引用 7 楼 zhangxiuyuan 的回复:
[quote=引用 6 楼 sundynes 的回复:]
问题解决了,我处理了下在槽函数中等待一百毫秒后接收的,就可以了完整接收了,因为是做简单处理,就没有改增加接收和发送协议,代码下面两行
	//读取二维码识别数据
m_serialPort->waitForReadyRead(100);
QByteArray info = m_serialPort->readAll();


每次读取串口数据都延迟100模式,会影响系统的实时性。[/quote]
这边需求对实时性没啥要求,主要是扫码器扫描二维码登陆用的,对实时性要求不高,且不会多次传数据,所以就这么做了
zhangxiuyuan 2019-05-29
  • 打赏
  • 举报
回复
引用 6 楼 sundynes 的回复:
问题解决了,我处理了下在槽函数中等待一百毫秒后接收的,就可以了完整接收了,因为是做简单处理,就没有改增加接收和发送协议,代码下面两行
	//读取二维码识别数据
    m_serialPort->waitForReadyRead(100);
	QByteArray info = m_serialPort->readAll();
每次读取串口数据都延迟100模式,会影响系统的实时性。
sundynes 2019-05-28
  • 打赏
  • 举报
回复
问题解决了,我处理了下在槽函数中等待一百毫秒后接收的,就可以了完整接收了,因为是做简单处理,就没有改增加接收和发送协议,代码下面两行
	//读取二维码识别数据
m_serialPort->waitForReadyRead(100);
QByteArray info = m_serialPort->readAll();
zhangxiuyuan 2019-05-28
  • 打赏
  • 举报
回复
发送方与接收方定义好协议,触发槽函数后全部读取,解析是否完整的一帧数据:如果不完整,缓存当前数据;如果完整,执行后续处理流程。
浮一大白开水 2019-05-21
  • 打赏
  • 举报
回复
协议一般包含包头、长度、校验码、数据、包尾。
浮一大白开水 2019-05-21
  • 打赏
  • 举报
回复
串口传输,正常现象。一般串口通讯,传输速率在那里,和读取频率,数据大小相关,还有数据丢失的出现,所以都会使用通讯协议来保证数据的完整性。
走好每一步 2019-05-21
  • 打赏
  • 举报
回复
不算是偶发性,说实话,我实现的经常遇到
走好每一步 2019-05-21
  • 打赏
  • 举报
回复
这是正常现象,需要自己组包,再解析协议。
内容概要:本文详细介绍了利用Simulink进行变压器开路试验的电路连接配置与仿真实现方法,重点在于通过仿真手段还原实际电力系统中变压器在空载条件下的电气特性,从而深入理解其工作原理与性能表现。文章作为电力系统仿真系列研究的一部分,系统阐述了从电路模型搭建、参数设定、仿真运行到结果分析的完整流程,突出展示了MATLAB/Simulink在电力设备建模与教学科研中的强大功能与应用价值。; 适合人群:具备电力系统基础知识,熟悉MATLAB/Simulink仿真环境,从事电气工程、自动化及相关领域的研发人员,以及高年级本科生和研究生。; 使用场景及目标:①掌握变压器开路试验的基本原理与Simulink仿真建模的具体步骤;②通过仿真实验深入理解空载电流、铁芯损耗及励磁特性等关键参数的物理意义;③为后续开展变压器短路试验、暂态过程分析以及其他电力设备的仿真研究奠定理论与实践基础。; 阅读建议:建议结合Simulink软件动手实践,逐步构建并调试电路模型,重点关注各元件参数的设置方法与测量模块的应用技巧,同时推荐参考文中提及的其他相关仿真案例进行拓展学习,以全面提升对电力系统仿真实践的整体认知与操作能力。

21,495

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧