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());
}
...全文
1862 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
  • 打赏
  • 举报
回复
这是正常现象,需要自己组包,再解析协议。

21,494

社区成员

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

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