憨憨也有爱 2022-12-21 16:35 采纳率: 100%
浏览 113
已结题

qt上位机串口处理芯片发送的1000hz数据怎样不丢包

qt上位机串口处理芯片发送的1000hz数据怎样不丢包,有什么好的方法和建议没!

  • 写回答

14条回答 默认 最新

  • 胖墩墩的小火苗子 2022-12-22 00:26
    关注

    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最方便省事儿了,如果接收到的数据长短不定没有其他规律的话,就可以用方法二,但是处理数据会比较麻烦一点点。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(13条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月27日
  • 已采纳回答 12月27日
  • 创建了问题 12月21日

悬赏问题

  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分
  • ¥15 Macbookpro 连接热点正常上网,连接不了Wi-Fi。
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 linux驱动,linux应用,多线程
  • ¥20 我要一个分身加定位两个功能的安卓app
  • ¥15 基于FOC驱动器,如何实现卡丁车下坡无阻力的遛坡的效果
  • ¥15 IAR程序莫名变量多重定义