当前位置:首页 » 硬盘大全 » qt监听串口缓存
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

qt监听串口缓存

发布时间: 2023-01-23 22:42:13

① 如何在QT中读取串口数据

一、文件下载
文件下载地址:
也可以下载我上传到网盘上的:
二、文件内容介绍
1.下载到的文件为qextserialport-1.2win-alpha ,解压并打开后其内容如下。
(点击图片可以查看清晰大图)
下面分别介绍:
(1)doc文件夹中的文件内容是QextSerialPort类和QextBaseType的简单的说明,我们可以使用记事本程序将它们打开。
(2)examples文件夹中是几个例子程序,可以看一下它的源码,不过想运行它们好像会出很多问题啊。
(3)html文件夹中是QextSerialPort类的使用文档。
(4)然后就是剩下的几个文件了。其中qextserialenumerator.cpp及qextserialenumerator.h文件中定
义的QextSerialEnumerator类是用来获取平台上可用的串口信息的。不过,这个类好像并不怎么好用,而且它不是我们关注的重点,所以下面
就不再介绍它了。
(5)qextserialbase.cpp和qextserialbase.h文件定义了一个QextSerialBase
类,win_qextserialport.cpp和win_qextserialport.h文件定义了一个Win_QextSerialPort
类,posix_qextserialport.cpp和posix_qextserialport.h文件定义了一个
Posix_QextSerialPort类,qextserialport.cpp和qextserialport.h文件定义了一个
QextSerialPort类。这个QextSerialPort类就是我们上面所说的那个,它是所有这些类的子类,是最高的抽象,它屏蔽了平台特征,
使得在任何平台上都可以使用它。
2.几个类的简单介绍。
下面是这几个类的关系图。
可以看到它们都继承自QIODevice类,所以该类的一些函数我们也可以直接来使用。图中还有一个QextBaseType类,其实它只是一个标
识,没有具体的内容,它用来表示Win_QextSerialPort或Posix_QextSerialPort
中的一个类,因为在QextSerialPort类中使用了条件编译,所以QextSerialPort类既可以继承自
Win_QextSerialPort类,也可以继承自Posix_QextSerialPort类,所以使用了QextBaseType来表示。这一点
我们可以在qextserialport.h文件中看到。再说QextSerialPort类,其实它只是为了方便程序的跨平台编译,使用它可以在不同的
平台上,根据不同的条件编译继承不同的类。所以它只是一个抽象,提供了几个构造函数而已,并没有具体的内容。在qextserialport.h文件中的
条件编译内容如下:
#ifdef_TTY_POSIX_
#include“posix_qextserialport.h”
#define QextBaseTypePosix_QextSerialPort
#else
#include“win_qextserialport.h”
#define QextBaseTypeWin_QextSerialPort
#endif
所以,其实我们没有必要使用这个类,直接使用Win_QextSerialPort或Posix_QextSerialPort就可以了。当然如果
你想使用这个类,实现同样的源程序可以直接在Windows和Linux下编译运行,那么一定要注意在Linux下这里需要添加
#define _TTY_POSIX_ 。而我们这里为了使得程序更明了,所以没有使用该类,下面也就不再介绍它了。
QextSerialBase类继承自QIODevice类,它提供了操作串口所必需的一些变量和函数等,而
Win_QextSerialPort和Posix_QextSerialPort均继承自QextSerialBase
类,Win_QextSerialPort类添加了Windows平台下操作串口的一些功能,Posix_QextSerialPort类添加了
Linux平台下操作串口的一些功能。所以说,在Windows下我们使用Win_QextSerialPort类,在Linux下我们使用
Posix_QextSerialPort类。
3.在QextSerialBase类中还涉及到了一个枚举变量QueryMode。
它有两个值Polling和EventDriven
。QueryMode指的是读取串口的方式,下面我们称为查询模式,我们将Polling称为查询方式Polling,将EventDriven称为事件驱动方式。
事件驱动方式EventDriven就是使用事件处理串口的读取,一旦有数据到来,就会发出readyRead()信号,我们可以关联该信号来读取串口的数据。在事件驱动的方式下,串口的读写是异步的,调用读写函数会立即返回,它们不会冻结调用线程。
而查询方式Polling则不同,读写函数是同步执行的,信号不能工作在这种模式下,而且有些功能也无法实现。但是这种模式下的开销较小。我们需要自己建立定时器来读取串口的数据。
在Windows下支持以上两种模式,而在Linux下只支持Polling模式。
三、小结。
这里讲了这么多,最后要说的只是,我们在Qt中使用这个类编写串口程序,根据平台的不同只需要分别使用四个文件。

② Qt串口占满一个内核

需要在一个计算机盒子上编写一个串口程序。
计算机盒子配置很差,内存CPU都比较差。然而硬件发送的数据有1000万个字节,波特率115200,发送频率小于1ms。可以设置一个data[10000000]的数组,将收到的所有数据存到缓存里,随时调用。
此外,接收用的数组可以用QByteArray。接收可以用单独的线程来做。ui主线程可以用个TextBrower控件,可以累计到一定的数据量一插入,可以是循环的话可以使用qApp->processEvents(),防止卡界面。

③ qt串口发送缓冲区设置

IPv4 数据报最大大小是65535(16位),包括IPv4头部。

IPv6 数据报最大大小是65575,包括40个字节的IPv4头部

MTU,这是由硬件规定的,如以太网的MTU是1500字节,IPv4要求最小MTU是68字节,IPv6要求最小MTU是576字节

path MTU: 指两台主机间的路径上最小MTU

分片(fragmentation):指ip数据报大小超过相应链路的MTU,IPv4和IPv6都将对ip数据进行分片,到达目的主机后进行重组。

IPv4头部的DF位用于设置分片还是不分片

MSS:最大分节大小,向对方TCP通告被通告方在每个分节中能发送的最大TCP数据量。MSS的目的是告诉对方其重组缓冲区大小的实际值,从而避免分片。

④ qt程序关闭后串口被占用

解决方法是:
1、主窗口打开子窗口后,在子窗口打开串口后直接点击关闭窗口。
2、会出现串口被占用的BUG,重写关闭窗口按钮即可解决。

⑤ qt串口接收的数据textedit中显示

连接串口时绑定信号和槽。
为了能在接收到串口发送的数据便即时显示在文本框中,首先要在连接串口时绑定信号和槽,即将serialport的signal(QIODevice::readyRead)与this的槽函数SePort::ReadCom连接在一起,这样,一旦serialport的准备读取数据信号过来时,就会调用自定义的ReadCom函数,把缓存区的数据读取到私有成员变量m_bReceiveData中。为了能在界面上显示,我们将暴露一个接口GetUsePort()以便于上层函数获得使用的串口serialport,然后自定义函数ShowData()将读取的数据实时显示在串口中。
Qt是一个1991年由QtCompany开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(MetaObjectCompiler,moc))以及一些宏,Qt很容易扩展,并且允许真正地组件编程。

⑥ qt串口编程清空缓存

又一个 clear()成员

⑦ qt 同时打开两个串口只有一个串口工作,求指点

串口共享,即两个同时可以 操作而不关 国外有这软件。而且很贵。一个授权要100$ 能这贵,我估计里面不是一两个代码能实现的。 串口监听 可以只读串口数据 不影响主程序工作。国内有的2000.你自己搜寻

⑧ 新手求助,QT5的qserialport串口操作,接收的数据不完整

发送的数据不能够太长,超过串口收发缓冲区长度,其他的都会丢弃的。

⑨ QT串口数据处理:用QT编写的上位机从下位机接受很多数据,如何才能从这些数据中跳出我想要的

Qt 4:
第三方串口接口类;
Win_QextSerialPort *myCom;
数据: QByteArray temp = myCom->readAll();
长度:temp.length();
Qt 5:
QSerialPort *my_serialport= new QSerialPort;
读取数据: QByteArray xxx = my_serialport->readAll();
长度: xx.size();
数据: xx.data();
至于说怎么保存到不同的 QString 这就是解析的问题,你可以随意发挥,反正就是将你得到的数据进行识别、类型转换、存储而已。

⑩ 我在Qt里写一个向串口写数据的程序,但是提示QIODevice::write: device not open,不知道怎么解决!

是服务器的端口没有打开。

1、首先pro文件配置:Qt网络功能需要在pro文件增加网络库。

注意事项:

int main()

{

Py_Initialize(); // 初始化// 将Python工作路径切换到待调用模块所在目录,一定要保证路径名的正确性string chdir_cmd = string("sys.path.append('/xxxxxxx/')");

// 加载模块PyObject* moleName = PyString_FromString("xx"); //模块名,不是文件名PyObject* pMole = PyImport_Import(moleName);

// 加载函数PyObject* pv = PyObject_GetAttrString(pMole, "xxx");// 调用函数PyObject* pRet = PyObject_CallObject(pv, xxx);