- 主题:请教一个qt串口读取的问题
异步编程就是这么麻烦。qt modbus 或者 asio http 库都是帮你封装好了,才会显得好用。
麻烦是麻烦了点。但思路还是很清晰的,就是把一个协议封装成一个类,不断地尝试条件,条件满足调用处理器。
struct ParseSerial {
QByteArray buf;
void parse() {
while (true) {
if (buf.contains(tail_term_1)) {
handleNormalPacket(buf.mid(0, buf.indexOf(tail_term_1)));
buf.remove(0, buf.indexOf(tail_term_1));
} else if (buf.size() >= nextPacketSize) {
handlePacket(buf.left(nextPacketSize));
buf.remove(0, nextPacketsize);
} else break;
}
}
};
ready 后读取数据 buf.append(data),再调用 parse()
【 在 scanworld (臭蛋超人) 的大作中提到: 】
: 待读取内容是unsigned char 十六进制 一个完整数据大约30个字节
: 有头有尾 尾前边有一个校验字节
: 读的过程中发现ready情况下 readall不一定读多长 这种怎么处理好些
: ...................
--
FROM 112.47.122.*
这样子会卡主线程的。。
得放到子线程里面去操作。
【 在 jesce (sogood) 的大作中提到: 】
: 要么加while(waitForReadyRead(N)); 等待一个frame结束, N取决于你的波特率
: 要么加个QByteArray类成员变量保存起来然后在每次readAll后解析
--
FROM 112.47.122.*
"\xee"
这个是 c/cpp 的知识了。
所以我经常说 qt 一点都不难,难的是 cpp
【 在 scanworld (臭蛋超人) 的大作中提到: 】
: 感谢回复 这个contains能直接里边接一个十六进制数吗 比如0xee
--
FROM 112.47.122.*
在子线程里面就没必要了。Qt 的串口类支持 waitForReady() 可以阻塞线程等数据。
【 在 scanworld (臭蛋超人) 的大作中提到: 】
: 是的 是在子线程里 通过ready这个槽来处理串口接收 不ready的时候不去接收
--
FROM 59.60.54.*