【记录自己的首次CSDN开贴】-关于QT接收串口数据的问题

        开始QT编程后,由于自己本身基础较差,需要经常查询一些简单无聊的问题,有些时候好多知识点只有个印象,记不太清楚导致下不去手写代码,都需要上网搜一搜,百度一搜出来的好多回答都是CSDN上的,也有博客园等其他网站或论坛,所以慢慢用CSDN就比较多了。

        之前更是很少在网上回答问题,今天回答了几个简单的问题,感觉自己也要慢慢入门了。回答了问题之后,感觉那些答案就是自己当时摸索时期的心路历程一样,需要好好记下来。所以就想干脆后边写一些文章,记录一下自己思路或者一些常用的知识点,这样以后自己忘记了可以很快查找翻阅一下,可以当个备忘录。同时如果这些东西对其他人有帮助的话,也是特别好的,也会让自己有成就感,给自己更多的前进动力。

        下边一些内容是我刚才回答其他人的答案,我就直接复制过来了,这会儿太晚了,脑袋转不动了,干脆直接复制了吧,后边有时间了在好好整理文章。

        仅此 —— 作为首次开贴的纪念,后边路漫长,要一步一步走……

1. QT波特率最大可设置到:QSerialPort::Baud115200;当然也有38400,19200,9600等波特率;最多每秒接收11.52Kb的内容;
2. 正常通讯的话,首先上位机QT设置的波特率要和下边设备发送的波特率要一样,这样才能正常建立通讯的。
3. 串口的话不知道你用的什么协议,如果只接收的话,看发送数据的特点;
4. 举例:电机驱动器常用的Modus/RTU协议,是一问一答式的,每次上位机发出消息之后,需要一定时间才能到达电机驱动器,电机驱动器发过来的从第一个字节到最后一个字节也需要一定时间,通常都是在毫秒级的。当QT上位机收到串口消息,消息过长,如果你立刻读取readall(),读取的只是前边一段消息,后边的内容还没发送过来,把它当成完整消息处理的话,就会丢失内容。
5. 通常处理这种问题有两种方法:一种是延时,串口消息在子线程内处理,根据发送过来内容的多少,计算消息一共需要多少毫秒(假设消息有一定的规律),当消息发送过来触发QSerialPort::readyread信号时,然后调用睡眠延时QThread::msleep(100),然后在接收发过来的数据readall(),可以完整接收数据;还有一种方法是一直接收消息并处理,设置while循环或者用waitForReadyRead(msecs),根据最后一次读取数据的时间和现在的时间判断是否超时,通常串口的两包数据之间需要一定的间隔比如上例的Modus/RTU协议,单个字节之间的接收时间超过一定时间差就可以判定这此包数据发送完成,不超时就一直接收并存储到容器或者QByteArry中,超时后跳出循环,这样也可以整包的消息,但是这样接受的消息需要整合处理,并核对帧头帧尾校验位等。
6. 9600波特率的话,每1秒可以接收9600位bit数据,看你的串口的每个字节有没有设置校验位(setParity(QSerialPort::NoParity)通常不设置校验位)和停止位是几位(setStopBits(QSerialPort::OneStop)通常是1位),这样可以计算一个字节的数据(起始位1bit+数据位8bit+停止位1bit=10bit)发送需要的位数,然后根据波特率可以计算出每个字节需要时间,可以以此来设置等待时间。
7. 通常如果收到的数据有规律的话,sleep最方便省事儿了,如果接收到的数据长短不定没有其他规律的话,就可以用方法二,但是处理数据会比较麻烦一点点。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胖墩墩的小火苗子

创作不易,谢谢鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值