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());
}
...全文
1896 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
  • 打赏
  • 举报
回复
这是正常现象,需要自己组包,再解析协议。
01、数据介绍 在量化业绩说明文本时,研究者通常采用自然语言处理(NLP)技术来提取关键特征,在构建管理层或投资者的情感语调时,普遍采用“净正面语调”作为核心指标。其计算公式通常为:净正面语调 = (正面词汇数 − 负面词汇数)/(正面词汇数 + 负面词汇数),该指标的取值范围在[-1, 1]之间,数值越大,表明发言者的情感语调越积极。 数据名称:上市公司业绩说明文本+情感语调 数据年份:2005-2024年 02、数据指标 服务业种类、服务业收入(万元)和服务业收入占比数据提取都来自:根据上市公司财务报表中经营范围的描述,将与主营业务相关的生产性服务分为以下八类:(1)技术支持服务,包括维修、保养、安装与检测等基本技术支持与售后服务;(2)销售服务,包括分销、批发、零售和国际贸易等;(3)咨询服务,包括产品咨询、管理咨询以及市场咨询等;(4)培训服务;(5)租赁服务,包括产品租赁和设备租赁等;(6)研发与信息服务,包括设计、研发、开发、维护、升级、转让、技术指导、数据及信息处理服务、系统集成、系统运营维护以及综合技术服务等;(7)金融服务,包括融资与保险等金融服务;(8)物流服务,包括物流、装卸、搬运、仓储和运输等。具体处理方法:按照关键词检索企业是否开展上述八类服务,在此基础上对服务种类进行加总,得到代表企业服务业务种类的变量。 问题序号:业绩说明提问问题的排序 提问内容:投资者提问内容 提问时间:投资者提问时间 回答人:回复投资者提问的人员 回答时间:回复投资者提问的时间 回答内容:对投资者提问的具体回复内容 正面词汇数量:回答内容中识别出的正面词汇数量 负面词汇数量:回答内容中识别出的负面词汇数量 正面词汇数比例:上市公司业绩说明管理层回答所用的正面语调词汇数目占管理层回答词汇总数的比例 负面词汇数比例:上市公司业绩说明

21,503

社区成员

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

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