QT串口接收解析问题

Votangroom 2018-01-16 08:51:50
我用的QT5.0。用的readall函数接收的。放在QBytearray类型的变量里。现在发送端不停发送一串内容(帧头0x68,9位数据,帧尾0xfb),我要如何编程接收?求大佬带过啊,最好能发代码我瞅瞅
...全文
1635 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
XAAHH 2019-09-04
  • 打赏
  • 举报
回复
先收藏一下在分析
qq_14910439 2019-05-05
  • 打赏
  • 举报
回复
有没有用c++写的!我也有相同的问题
Votangroom 2018-01-17
  • 打赏
  • 举报
回复
恩恩,现在在考虑 校验和 和 帧头帧尾恰巧相等的情况,该如何处理。目前只有一个笨办法:直接丢掉
faihung 2018-01-17
  • 打赏
  • 举报
回复
引用 4 楼 qq_26664187 的回复:
已找到解决方法: 1、不完整的原因:分开多次接收,这个你很难控制得了 2、解决办法:首先严格定义头部和尾部;然后把处理逻辑写完整,一个都不能漏 3、下面定义头部为"{",尾部为"}",变量类型全部为QByteArray ============================================================== BufferData = MySerialPort->readAll(); //异常类:无头且变量为空,已丢失头部,数据不可靠,直接返回 if ((!BufferData.contains("{"))&(PasteData.isNull())) { return; } //第一种:有头无尾,先清空原有内容,再附加 if ((BufferData.contains("{"))&(!BufferData.contains("}"))) { PasteData.clear(); PasteData.append(BufferData); } //第二种:无头无尾且变量已有内容,数据中段部分,继续附加即可 if ((!BufferData.contains("{"))&(!BufferData.contains("}"))&(!PasteData.isNull())) { PasteData.append(BufferData); } //第三种:无头有尾且变量已有内容,已完整读取,附加后输出数据,并清空变量 if ((!BufferData.contains("{"))&(BufferData.contains("}"))&(!PasteData.isNull())) { PasteData.append(BufferData); ReadData = PasteData; PasteData.clear(); } //第四种:有头有尾(一段完整的内容),先清空原有内容,再附加,然后输出,最后清空变量 if ((BufferData.contains("{"))&(BufferData.contains("}"))) { PasteData.clear(); PasteData.append(BufferData); ReadData = PasteData; PasteData.clear(); } ui.textEdit->setText(ReadData);
当然还少不了CRC校验
Votangroom 2018-01-17
  • 打赏
  • 举报
回复
不管是应答模式 还是连续发送的模式,都是可行的。接收到的数据就一开始瞬间会出现错误(估计一开始的时候波特率没对上??或者我单片机程序没写好吧),但是马上就接收正常了,虽然上面写了这类异常的处理方法 但是并没有处理也是有点疑惑。不过最后还是可行的!
Votangroom 2018-01-17
  • 打赏
  • 举报
回复
已找到解决方法: 1、不完整的原因:分开多次接收,这个你很难控制得了 2、解决办法:首先严格定义头部和尾部;然后把处理逻辑写完整,一个都不能漏 3、下面定义头部为"{",尾部为"}",变量类型全部为QByteArray ============================================================== BufferData = MySerialPort->readAll(); //异常类:无头且变量为空,已丢失头部,数据不可靠,直接返回 if ((!BufferData.contains("{"))&(PasteData.isNull())) { return; } //第一种:有头无尾,先清空原有内容,再附加 if ((BufferData.contains("{"))&(!BufferData.contains("}"))) { PasteData.clear(); PasteData.append(BufferData); } //第二种:无头无尾且变量已有内容,数据中段部分,继续附加即可 if ((!BufferData.contains("{"))&(!BufferData.contains("}"))&(!PasteData.isNull())) { PasteData.append(BufferData); } //第三种:无头有尾且变量已有内容,已完整读取,附加后输出数据,并清空变量 if ((!BufferData.contains("{"))&(BufferData.contains("}"))&(!PasteData.isNull())) { PasteData.append(BufferData); ReadData = PasteData; PasteData.clear(); } //第四种:有头有尾(一段完整的内容),先清空原有内容,再附加,然后输出,最后清空变量 if ((BufferData.contains("{"))&(BufferData.contains("}"))) { PasteData.clear(); PasteData.append(BufferData); ReadData = PasteData; PasteData.clear(); } ui.textEdit->setText(ReadData);
Votangroom 2018-01-17
  • 打赏
  • 举报
回复
我目前用MSP430发串口信息(不停地发的那种,不是应答模式),然后想在QT上处理数据...(帧头0x68,9位数据,帧尾0xfb)因为他readAll回来是QBytearray的数据.....就是之前没在QT上写过,所以想请教下有没有大佬会
faihung 2018-01-17
  • 打赏
  • 举报
回复
引用 1楼faihung 的回复:
看你下位机如何处理了,是单片机接收还是操作系统接收。然后处理机制就不一样。
串口接收,估计要用到中断了。
faihung 2018-01-17
  • 打赏
  • 举报
回复
看你下位机如何处理了,是单片机接收还是操作系统接收。然后处理机制就不一样。
void Widget::Select() //查询 { QString name = ui->lineEdit->text(); model->setFilter(QObject::tr("id = '%1'").arg(name)); //根据姓名进行筛选 model->select(); //显示结果 } void Widget::Delect() //删除当前行 { int curRow = ui->tableView->currentIndex().row(); //获取选中的行 model->removeRow(curRow); //删除该行 int ok = QMessageBox::warning(this,tr("删除当前行!"),tr("你确定" "删除当前行吗?"), QMessageBox::Yes,QMessageBox::No); if(ok == QMessageBox::No) { model->revertAll(); //如果不删除,则撤销 } else model->submitAll(); //否则提交,在数据库中删除该行 } void Widget::Add() //插入记录 { int rowNum = model->rowCount(); //获得表的行数 int id = 10; model->insertRow(rowNum); //添加一行 model->setData(model->index(rowNum,0),id); //model->submitAll(); //可以直接提交 } void Widget::Back() //返回全表 { model->setTable("student"); //重新关联表 model->setHeaderData(0, Qt::Horizontal, "Time"); model->setHeaderData(1, Qt::Horizontal, "Temperature"); model->select(); //这样才能再次显示整个表的内容 } void Widget::Amend() //提交修改 { model->database().transaction(); //开始事务操作 if (model->submitAll()) { model->database().commit(); //提交 } else { model->database().rollback(); //回滚 QMessageBox::warning(this, tr("tableModel"), tr("数据库错误: %1").arg(model->lastError().text())); } } void Widget::Get_time() { QString string; QTime current_time = QTime::currentTime(); int hour = current_time.hour(); int minute = current_time.minute(); int second = current_time.second(); // int msec = current_time.msec(); string=QString("%1").arg(hour)+":"+QString("%1").arg(minute) +":"+QString("%1").arg(second); ui->Receive->append(string); //qDebug() insertRow(rowNum); //添加一行 model->setData(model->index(rowNum,0),string); model->submitAll(); } void Widget::readMyCom() { QByteArray temp = myCom->readAll(); if(temp.size()!=0) { QString string; QTime current_time = QTime::currentTime(); int hour = current_time.hour(); int minute = current_time.minute(); int second = current_time.second(); // int msec = current_time.msec(); string=QString("%1").arg(hour)+":"+QString("%1").arg(minute) +":"+QString("%1").arg(second); ui->Receive->append(string); //qDebug() insertRow(rowNum); //添加一行 model->setData(model->index(rowNum,0),string); model->setData(model->index(rowNum,1),temp); model->submitAll(); data_light=temp.toInt(); } ui->Receive->append(temp); } void Widget::openCom() { QString portName = ui->portNameComboBox->currentText(); myCom = new Win_QextSerialPort(portName,QextSerialBase::EventDriven); myCom ->open(QIODevice::ReadWrite); if(ui->baudRateComboBox->currentText()==tr("9600")) myCom->setBaudRate(BAUD9600); else if(ui->baudRateComboBox->currentText()==tr("115200")) myCom->setBaudRate(BAUD115200); myCom->setFlowControl(FLOW_OFF); myCom->setTimeout(500); connect(myCom,SIGNAL(readyRead()),this,SLOT(readMyCom())); ui->openMyComBtn->setEnabled(false); ui->closeMyComBtn->setEnabled(true); ui->baudRateComboBox->setEnabled(false); ui->portNameComboBox->setEnabled(false); }

27,373

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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