QT串口接收解析问题

Votangroom 嘉兴学院 工程师  2018-01-16 08:51:50
我用的QT5.0。用的readall函数接收的。放在QBytearray类型的变量里。现在发送端不停发送一串内容(帧头0x68,9位数据,帧尾0xfb),我要如何编程接收?求大佬带过啊,最好能发代码我瞅瞅
...全文
646 1 收藏 9
写回复
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日
看你下位机如何处理了,是单片机接收还是操作系统接收。然后处理机制就不一样。
回复 点赞
发动态
发帖子
单片机/工控
创建于2007-09-28

1.0w+

社区成员

2.8w+

社区内容

硬件/嵌入开发 单片机/工控
社区公告
暂无公告