- 主题:请教一个qt串口读取的问题
待读取内容是unsigned char 十六进制 一个完整数据大约30个字节
有头有尾 尾前边有一个校验字节
读的过程中发现ready情况下 readall不一定读多长 这种怎么处理好些
网上有用contains判断是否包含某个字符的方式 对十六进制的有什么好办法呢
还是只能从接收的里边先找到头再按数据长度去定位尾和校验 不够长再去等
但是感觉这种办法还是不太靠谱 如果信号处理的时候中间下位机发上来又有数据
会不会发生错过丢失的情况
请指点一二
--
FROM 120.244.24.*
有头有尾,你自己发送的信息头里面加一个长度就行了
【 在 scanworld 的大作中提到: 】
: 待读取内容是unsigned char 十六进制 一个完整数据大约30个字节
: 有头有尾 尾前边有一个校验字节
: 读的过程中发现ready情况下 readall不一定读多长 这种怎么处理好些
: ...................
--
FROM 92.40.168.*
不用太担心数据丢失问题,
底层有缓存的
【 在 scanworld 的大作中提到: 】
: 待读取内容是unsigned char 十六进制 一个完整数据大约30个字节
: 有头有尾 尾前边有一个校验字节
: 读的过程中发现ready情况下 readall不一定读多长 这种怎么处理好些
: ...................
--
FROM 223.104.3.*
异步编程就是这么麻烦。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.*
要么加while(waitForReadyRead(N)); 等待一个frame结束, N取决于你的波特率
要么加个QByteArray类成员变量保存起来然后在每次readAll后解析
【 在 scanworld 的大作中提到: 】
: 待读取内容是unsigned char 十六进制 一个完整数据大约30个字节
: 有头有尾 尾前边有一个校验字节
: 读的过程中发现ready情况下 readall不一定读多长 这种怎么处理好些
: ...................
--
FROM 113.118.112.*
这样子会卡主线程的。。
得放到子线程里面去操作。
【 在 jesce (sogood) 的大作中提到: 】
: 要么加while(waitForReadyRead(N)); 等待一个frame结束, N取决于你的波特率
: 要么加个QByteArray类成员变量保存起来然后在每次readAll后解析
--
FROM 112.47.122.*
理论上开个线程是好点, 实际用的话可能也没什么关系. 如果115200波特率30个字节, 也就3ms的时间, 一些的IDE输入字符差不多也要延时这个级别.
【 在 hgoldfish 的大作中提到: 】
: 这样子会卡主线程的。。
: 得放到子线程里面去操作。
:
--
FROM 113.118.112.*
感谢回复 这个contains能直接里边接一个十六进制数吗 比如0xee
【 在 hgoldfish 的大作中提到: 】
: 异步编程就是这么麻烦。qt modbus 或者 asio http 库都是帮你封装好了,才会显得好用。
: 麻烦是麻烦了点。但思路还是很清晰的,就是把一个协议封装成一个类,不断地尝试条件,条件满足调用处理器。
: struct ParseSerial {
: ...................
--
FROM 120.244.24.*
是的 是在子线程里 通过ready这个槽来处理串口接收 不ready的时候不去接收
【 在 jesce 的大作中提到: 】
: 理论上开个线程是好点, 实际用的话可能也没什么关系. 如果115200波特率30个字节, 也就3ms的时间, 一些的IDE输入字符差不多也要延时这个级别.
:
--
FROM 120.244.24.*
"\xee"
这个是 c/cpp 的知识了。
所以我经常说 qt 一点都不难,难的是 cpp
【 在 scanworld (臭蛋超人) 的大作中提到: 】
: 感谢回复 这个contains能直接里边接一个十六进制数吗 比如0xee
--
FROM 112.47.122.*