Qt串口通讯QSerialport接受数据失帧问题

最近在写一个上位机软件,用Qt做的,串口通信用的是QSerialport类,使用它本身提供的readyread信号,当有检测到有数据的时候触发我编写的接受处理函数,数据的接收使用
QByteArrary recvdata = serial->readAll();
将得到的recvdata返回,进行每一帧的提取和后续的处理,现在出现一个问题,在波特率是115200的情况下,没有失帧的情况出现,当我把波特率升到921600后,出现严重的失帧情况。下位机给上位机发送的数据是每帧64字节,数据位8位,1位停止位,1位校验位,差不多1.25ms就发送一帧,持续不断地发送。请问该怎么解决失帧的问题。(这个问题拖了挺久,本人代码经验很少,菜鸟类型,这是刚入职的任务,有什么疑问请都提出来,十分想解决这个东西,谢谢)

2个回答

qq_29560571
qq_29560571 修改头文件没啥用嘛,它这个都封装好了,有啥办法可以改啊
11 个月之前 回复

QT不支持这么大的波特率吧

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
QT 客户端服务端串口通讯QSerialPort
QT写的c++ 客户端服务端串口通讯QSerialPort;QSerialPort类是Qt5封装的串口类,可以与串口进行通信。QSerialPortInfo是一个辅助类,提供串口的一些信息,如可用的串口名称,描述,制造商,序列号,串口16位产品编号等。利用QSerialPortInfo提供的可用串口信息,可设置串口波特率,并打开需要的串口进行通信。
串口通讯接受数据问题
我通过串口接受到二进制文件,我该用什么什么样的模式去接受它,我用的是comInputmodetext文件接受模式,接受的数据好象有几位出错,该怎么样改正
Qserialport QT
基于QT开发的一些C++串口助手的demo很全,幸苦收集不易。
QT 串口通讯QSerialPort类简单用法
  QT串口编程用到QSerialPort类与QSerialPortInfo类。 -QSerialPort:提供访问串口的功能 ,读写操作是通过该类来实现的。 -QSerialPortInfo:提供系统中存在的串口的信息,一般用于查询当前连接的串口信息。 QSerialPort类 使用方法 步骤1,在pro 文件中加     QT       += serialport   步骤2,...
Qt串口通信,QSerialPort的使用
前言 Qt写上位机时,串口通信是个常用功能,在Qt4的时候有第三方模块QextSerialPort,到了Qt5.1官方提供了QSerialPort模块。 目录 前言 获取串口信息:QSerialPortInfo 串口IO操作:QSerialPort 实例操作 补充:16进制文本(如“0A 13 EF”)转16进制数据(如0x0A 0x13 0xEF) 使用该模块需要在pro文件中添...
利用Qt中QSerialPort的类写串口通讯助手
首先,还是先说QSerialPort是Qt5.1引入的,其中一个问题是在读取数据时,采用QIO:Device中的信号readyread,这个信号在处理底层串口缓冲区时,是只要缓冲区一有数据,立马发送这个信号,所以我们在连接这个信号时会发生接收数据不完整(我这边是出现打开串口后,接收第一次的数据少字节)。所以很多人建议不使用这个类,采用QExtSerialPort这个第三方库。但是,如果要求不是很高
QSerialport
大部分就做了几个功能,串口的正常读写已经不用说了,主要是通过自动连接,以及USB断开的时候提醒以及再次插上的时候的提醒 自动连接主要是通过开机获取所有的端口名
QserialPort 串口数据发送的问题
问题描述: Qbytearray 中每一位能给存储的最大值为127,所以当我的停止位中有0xAA时,显示的其实是-85(为反码), 而且 只能用Qserialport->write()发送数据,其中的参数只能是Qbytearray 或者char* 格式; 解决方法: 发现虽然 显示的是-85 ,但实际发送过去后,下位机依然能给识别为0xAA ,之前一起没成功是因为波特率设置
Qt 串口类QSerialPort 学习笔记
一、串口类简介 当前的QtSerialPort模块中提供了两个C++类,分别是QSerialPort 和QSerialPortInfo。   QSerialPort 类提供了操作串口的各种接口。   QSerialPortInfo 是一个辅助类,可以提供计算机中可用串口的各种信息。 使用方法     先介绍 QSerialPortInfo 的使用。下面是一
qt qserialport串口号自动更新
QSerialPort目的自动更新串口号效果参考例程 目的 解决插拔设备时,串口号不实时更新的问题。 自动更新串口号 timer = new QTimer; connect(timer,&QTimer::timeout,this,&serial::UpdatePort);//更新端口号 timer->start(1000); QStringLi...
QT 串口QSerialPort + 解决接收数据不完整问题
类:QSerialPort 例程:Examples\Qt-5.9.1\serialport\terminal,该例子完美展示了qt串口收发过程,直接在这上面修改就可以得到自己的串口软件。核心方法 //读串口 QByteArray QSerialPort::readAll() //写串口 qint64 QSerialPort::write(const QByteArray &data) 注
▲▲▲关于上传图片缩小时失帧的问题
现把一张1280:960的图片上传时自动缩小成800:600的图片失帧太利害了。我用的方法是rnSystem.Drawing.Image image,newimage;rnimage = System.Drawing.Image.FromFile(postedFile.FileName);rnnewimage = image.GetThumbnailImage(800,600,null,new System.IntPtr());rnnewimage.Save(System.Web.HttpContext.Current.Request.MapPath("upfiles/") + newname+fileExtension);rn image.Dispose();rn newimage.Dispose();rnrn请求各位高手看看,谢谢,在线等待。。。rnrn
QT 串口通讯问题咨询?
小弟最近搞一个上位机简单的界面做与单片机串口收发用(之前没搞过c++。迷迷糊糊的)。串口通讯都没问题了。问题是;单片机上发一个串数据 比如 01 02 03 04 05 06;qt是怎么取里面的字节的啊。我的目的是:想通过单片机上发的数据里面的第二个字节的内容来判断的。小弟跪谢
qt 串口通讯问题咨询?
小学最近在开发一个qt的上位机平台软件,和单片机做串口通讯。是用第三方类做串口的。想问下如果要下发一个数组:比如rnchar a[3] = 0x01,0x02,0x03;是要怎么写?之前没接触过qt,可以的话,麻烦给个代码,谢谢
QSerialPort
使用Qt自带类实现串口通信,包含串口数据读写。
MFC串口通讯接受数据双缓冲画波形图
采用api串口通讯技术,线程处理方式接受发送union数据转为float,将float以波形画出来显示在界面
QT串口通讯
串口通讯程序 PROJECT = qextserialport TEMPLATE = lib CONFIG += debug_and_release CONFIG += qt CONFIG += warn_on CONFIG += thread CONFIG += dll #CONFIG += staticlib QT -= gui OBJECTS_DIR = build/obj MOC_DIR = build/moc DEPENDDIR = . INCLUDEDIR = . HEADERS = qextserialbase.h \ qextserialport.h \ qextserialenumerator.h SOURCES = qextserialbase.cpp \ qextserialport.cpp \ qextserialenumerator.cpp unix:HEADERS += posix_qextserialport.h unix:SOURCES += posix_qextserialport.cpp unix:DEFINES += _TTY_POSIX_ win32:HEADERS += win_qextserialport.h win32:SOURCES += win_qextserialport.cpp win32:DEFINES += _TTY_WIN_ win32:LIBS += -lsetupapi DESTDIR = build #DESTDIR = examples/enumerator/debug #DESTDIR = examples/qespta/debug #DESTDIR = examples/event/debug CONFIG(debug, debug|release) { TARGET = qextserialportd } else { TARGET = qextserialport } unix:VERSION = 1.2.0
qt串口通讯
用qt开发串口通讯的指导资料
Qt串口通讯
用Qt做的一个串口调试助手,实现了基本功能,支持10进制 16进制
Qt 串口通讯
Qt 串口通讯
急急!大虾请进! 关于串口通讯 接受数据....
小弟初入门,要编一个串口通讯的程序, 用spcomm 控件,在onreceivedata 接受数据 ,要接受的是为十位十六进制数,如 6b4545e890 ,怎么也试不出来,请大虾指点.
QT 串口通讯
记录一些坑 1.发送时返回值也正确,可就是发送不出去! 在mainwindow里面实列的串口类,在其他线程调用发送,怎么都发送不出去! 原因:串口类不可以跨线程调用,虽然返回值正确,但是发送不成功,不可以在跨线程!。 解决:用槽即可解决。
QT5.3的串口通讯问题,怀疑QSerialport类有bug
我用的是QT5自带的QSerialport类rn串口的另一端一个采集仪,它检测到开/关门事件就发给我19个字节的数据rn问题是:偶尔有时候一次读到的数据为什么不足19个字节,而且在下次开/关门事件触发之前根本就读不出来那些没读到的数据,下次开/关门的时候,上次没读完的数据又读了出来rn我总怀疑QT5的串口有bug,哪位高手帮我看看是不是我的代码写的有问题rn读取串口代码如下(放在一个线程里不停的循环读取,mysp是一个QSerialport对象)rn[code=c]rnvoid mythread4::run()rnrn while(this->stoped==false)rn rn if(mysp->waitForReadyRead(-1)) //等待有数据到达,-1表示永不超时rn rn this->msleep(150); //延时一会,等待数据全部到达rn QByteArray b=mysp->readAll();rn for(int i=0;i
(1)Qt利用QSerialPort使用串口
1.编译环境:Qt 5.8.0  2.实现方法:使用Qt中的QSerialPort类。 3.头文件: #include   pro文件中加入: QT += serialport 4.具体实现: 初始化:在Mainwindowli 创建QSerialPort类并进行相关的信号槽连接: serial = new QSerialPort(this); //创建QSeria
QSerialPort为什么读取不到数据
这个是手动调用read读取串口通讯数据,m_port->waitForReadyRead(450);这个注释掉就一直读不到数据,这是为什么啊?????rn QByteArray by = 0;rn char c[10] = 0 ;rn int pos = 0;rn //bool isWrite = m_port->waitForReadyRead(450);rnrn while (pos < count)rn rn by = m_port->readAll();rn //pos += m_port->read(c,count-pos);rn qDebug() << " pos === " << by << " count ==== " << count;rn rn by.append(c);
qt与单片机串口通讯问题咨询
小弟最近搞一个上位机简单的界面做与单片机串口收发用(之前没搞过c++。迷迷糊糊的)。串口通讯都没问题了。问题是;单片机上发一个串数据 比如 01 02 03 04 05 06;qt是怎么取里面的字节的啊。我的目的是:想通过单片机上发的数据里面的第二个字节的内容来判断的。小弟跪谢
API串口通讯数据接受的问题。急求解答!!
我用API函数作串口通讯,各种参数设置都没有什么问题,都是按标准状况设计的,但是没有使用硬件流控制和软件流控制。在接受数据的时候,每次有40-60个字节,总是先收到8个字节的数据,然后再收到剩下的几十个字节?请问是怎么回事,有什么方法可以解决??这种现象使我很是困惑,我是使用事件驱动方式实现的,当缓冲区有数据的时候给我事件通知,这是有专门的线程完成。为什么数据还没有完全收到就通知我了呢?而且总是8个字节?
QT如何使用QSerialPort类写串口
先说我要输出串口的数据rn协议为:0x84, channel number, target low bits, target high bitsrn假设需要第二信道输出值为6000(0101110 1110000)rn协议的二进制则为10000100, 00000010, 01110000, 00101110rn协议的十六进制则为0x84, 0x02, 0x70, 0x2Ernrn官方给了个c的例子rnserialBytes[0] = 0x84; // Command byte: Set Target.rnserialBytes[1] = channel; // First data byte holds channel number.rnserialBytes[2] = target & 0x7F; // Second byte holds the lower 7 bits of target.rnserialBytes[3] = (target >> 7) & 0x7F; // Third data byte holds the bits 7-13 of target.rn这里得target应该是十六进制的6000吧???rnrn之后是重点,如何使用"QSerialPort::write(command)"rn原来command定义成char,但是使用不了,貌似qt需要用个QByteArray来写串口,如何写这段程序???
关于接受帧的问题(急急急)
使用muxBind 绑定系统驱动nt, 在muxbind的参数里添加了 stackRcvRtn 这个回调函数,这样就能接受到所有的帧吗?驱动接受到的数据就直接传递给stackRcvRtn了? 还是接受帧还要调用其他的函数? 求解
QSerialport多线程问题
第一次发帖,这个问题困扰我好久了,如下面代码所示,把如果把串口初始化和发送数据放在构造函数里,那么单片机可以收到数据;可是把串口初始化和发送数据放在run()里面,单片机则收不到数据,但是qDebug()<<"333";和qDebug()<<"444";照常打印。我用的是qt4.8.4rn[code=c]#include "serialportthread.h"rnrnSerialportThread::SerialportThread(QObject *parent) :rn QThread(parent)rnrn if(0)rn rn qDebug()<<"222";rn //初始化串口rn myserialport=new QSerialPort();rnrn myserialport->setPortName("COM4");rn myserialport->open(QIODevice::ReadWrite);rn myserialport->setBaudRate(QSerialPort::Baud115200);rn myserialport->setDataBits(QSerialPort::Data8);rn myserialport->setParity(QSerialPort::NoParity);rn myserialport->setStopBits(QSerialPort::OneStop);rn myserialport->setFlowControl(QSerialPort::NoFlowControl);rnrn int d=77;rn QString str=QString::number(d); //使用QString::number()静态函数将整数转换为QStringrn QByteArray TxData=str.toAscii(); //QString转换为QByteArrayrn qDebug()<<"333";rn myserialport->write(TxData+"\r\n");//注意:发送的消息必须以\r\n结尾rn qDebug()<<"444";rn rnrnrnvoid SerialportThread::run()rnrn if(1)rn rn qDebug()<<"222";rn //初始化串口rn myserialport=new QSerialPort();rnrn myserialport->setPortName("COM4");rn myserialport->open(QIODevice::ReadWrite);rn myserialport->setBaudRate(QSerialPort::Baud115200);rn myserialport->setDataBits(QSerialPort::Data8);rn myserialport->setParity(QSerialPort::NoParity);rn myserialport->setStopBits(QSerialPort::OneStop);rn myserialport->setFlowControl(QSerialPort::NoFlowControl);rnrn int d=77;rn QString str=QString::number(d); //使用QString::number()静态函数将整数转换为QStringrn QByteArray TxData=str.toAscii(); //QString转换为QByteArrayrn qDebug()<<"333";rn myserialport->write(TxData+"\r\n");//注意:发送的消息必须以\r\n结尾rn qDebug()<<"444";rn rnrn/********************************************************************************/rn#ifndef SERIALPORTTHREAD_Hrn#define SERIALPORTTHREAD_Hrnrn#include rn#include rn#include rn#include rnrnclass SerialportThread : public QThreadrnrn Q_OBJECTrnpublic:rn explicit SerialportThread(QObject *parent = 0);rn QSerialPort *myserialport;rn void run();rnsignals:rn rnpublic slots:rnrnprotected:rnrnrnprivate:rnrnrn;rnrn#endif // SERIALPORTTHREAD_Hrn[/code]
QSerialPort和MSP430串口通信问题
rnrn通信过程时是这样的,上位机发送动作命令给下位机,下位机响应命令,完成对应动作后发送反馈给上位机,循环执行。rn问题出在循环几次后下位机数据已发送,上位机却没有读到数据。rnrn上位机接受数据的是rn connect(serialDevice, SIGNAL(readyRead()), this, SLOT(ReadAvailable()));rnrn有碰到过类似问题嘛?rn有经验的也请指教。rn谢谢rnrn
qt最小化托盘失焦问题
尽量不要在托盘菜单中启动其它窗体,将这些窗体从主窗体启动
串口通讯和数据比对问题!
现在要做一个程序,跟串口通讯有关,下位机开起来后 会不定时的给串口发来16进制的数据,一个2位的16进制数据表示一个符号,比如 61 代表的是a 这样的一个数据比对放在什么地方做比较好?另外串口通讯要用到什么函数?谢谢!
CSocket发送的数据过多,接受端接受会出现数据掉失怎办??急!!
发送数据太多,接收会出现数据掉失, 是TCP模式,各位大侠,如何解决??
串口通讯 数据的区分问题
rn在串口通讯时终端设备可能一会儿发送的一条命令比如:C8 A1 01 03,过一会儿又发送了一个命令:C3 A2 15 05 98.也就是说收到的命令的长度、格式是不确定。rnrn如果利用mscomm控件接收,那很简单,通过comEvReceive事件触发,取得msComm.Input中的数据,这样,每次取得的自然是一条连续的数据,上面的两条命令分别触发两次comEvReceive事件,分别用Input方法取得数据就可以了。rnrn如果利用DotNet中的NETSerialComm类进行串口通讯,每收到一个字节的数据OnRxChar事件就被被触发,那我该如何判断C8 A1 01 03是一条数据,C3 A2 15 05 98是另一条数据,而不错误的判断成:C8 A1 01 03 C3是一条数据,A2 15 05 98是另一条数据?rnrn先谢谢大家了。
串口通讯返回数据的问题
大家好?用VB6自带的串口控件开发一个小程序,接收从车间设备返回的数据(计数),并存储到网络数据库当中。之前在我的电脑上(主板自带串口)上运行这个小程序,没有什么问题,返回数据可以正常接收并保存到数据库中。可当将程序移植到另外一台电脑(该电脑没有自带串口,是通过一个USB转232的适配器接收返回数据)上,这时问题就出现了:用串口助手或在VB6中用断点调试状态下可以正常接收返回数据并运行。但如果编译运行该程序,就无法正确接收该数据(代码中是通过一个判断语句来接收并保存数据,如果返回的数据格式符合判断语句的要求,就会执行下面的接收和保存语句,但这时就是不执行)。rn说了这么多,我现在觉得问题就是出在返回的数据格式上,自带的串口就可以正确返回数据格式;但利用转接的设备就不行。我不知道各位大侠有没有遇到过这种情况,帮我判断一下,到底是不是这个问题?还是我的程序语句有问题。rn在线急等!谢谢各位!
请教一个串口通讯十六进制发送,接受的问题?
请问,串口通讯中我发送得十六进制指令是"ca 03 01 11 01",为什么在接受区里显示得是"CA CA 03 03 01 01 11 11 01 01"?rn请大哥大姐帮忙啊!
16进制数据串口通讯的问题
最近一个项目用到以16进制数据进行串口通讯rn要求:读取信号测量值rn命令:A30CCrn A (范围0X00-0XFF),表示指定传感器的16进制地址,一字节rn 30 功能码(十六进制)rn CC CRC16校验码rn回答:A3004(data)CCrn A (范围0X00-0XFF),表示指定传感器的16进制地址,一字节rn 30 功能码(十六进制)rn 04 数据字节长度rn data 四字节数据,表示信号的测量值rn CC CRC16校验码rnrn命令集中所有数据均为16进制表示rnrn以前只做过串口读取ascii码的数据,没做过读取16进制数据,不知道怎么发送请求命令,并读取数据.还有数据是16进制的,在控件上要不要设什么rnrn还有最后的crc16效验码不知道怎么生成,网上看见些现成的crc16函数,但不知道怎么和这问题结合起来rnrn高手帮帮我啊,我一般使用cnrs232控件(spcomm的修改版)rn
vb串口通讯发送和接受的难处
各位好,现在正在做一程序,vb和西门子plc,s7-300通讯的项目(十六进制)。单独做上位机接受数据时可以正常接收到plc发过来的十六进制信息 ,但是然后续上上位机发送数据代码就不能通讯成功,不知道发送数据应该如何写。协议是:上位机接受40字节。发送25字节。第一位起始位255。中间的数据就忽略不写了。发送和接受时交叉进行的。哪位能给具体提示一下逻辑上需要如何改正啊,现在就感觉不对,但是不知道该修改哪里。谢谢!rn具体代码如下 rn[code=VB][/code]Private Sub MSComPLC_OnComm() rn Dim buffer As Variant rn Dim InString(0 To PLCRxCount - 1) As Byte rn Dim i As Integer rn Dim SupplyNum As Integer rn Dim CheckInt As Integer rn Dim CheckByte As Byte rn Dim errTemp As Integer rn rn Select Case MSComPLC.CommEvent rn '================================================================== rn ' 接收数据 rn '================================================================== rn Case comEvReceive rn rn MSComPLC.InputLen = 0 rn buffer = MSComPLC.Input rn rn For i = 0 To PLCRxCount - 1 rn InString(i) = buffer(i) rn Next i rn '================================================================== rn ' 检查数据完整性/ 计算校验和 rn '================================================================== rn CheckInt = 0 rn For i = 0 To PLCRxCount - 2 rn CheckInt = CheckInt + InString(i) rn Next i rn CheckByte = CheckInt Mod 256 rn '================================================================== rn ' 更新上纸台信息,并设置Refresh标志以便更新显示 rn '================================================================== rn If (InString(0) = 255) And (CheckByte = InString(PLCRxCount - 1)) Then rn '上纸台可以接受命令 rn ...rn ...rn ...(中间程序,可以忽略与本问题无关)rnrn End If rnEnd Select rnEnd Sub rnrnPrivate Sub TmPLC_Timer() rn Dim OutString(0 To PLCTxCount - 1) As Byte rn Dim CheckInt As Integer rn Dim j As Integer rn Dim i As Integer rn Dim AndBit As Integer rn rn ' 特征字节 rn OutString(0) = 255 rn ...rn ...rn ...(z中间字节,可以忽略,与本问题无关)rn rn ' 校验字节,由计算确定 rn CheckInt = 0 rn For j = 0 To PLCTxCount - 2 rn CheckInt = CheckInt + OutString(j) rn Next j rn OutString(PLCTxCount - 1) = CheckInt Mod 256 rn Next i rn rn '========================================================================== rn ' 发送通讯字节内容 rn '========================================================================== rn MSComPLC.InBufferCount = 0 rn MSComPLC.Output = OutString rnEnd Sub rn
Qt下串口通讯程序请教
哪位老大有Qt写的串口通讯程序源代码,给点参考资料也行啊。
相关热词 c#检测非法字符 c#双屏截图 c#中怎么关闭线程 c# 显示服务器上的图片 api嵌入窗口 c# c# 控制网页 c# encrypt c#微信网页版登录 c# login 居中 c# 考试软件