Ⅰ liunx下qt串口通讯怎么办,以前没接触过,现在要写串口驱动不知怎么搞,网上的资料表示不很理解
串口通信一般为三步:打开串口,串口设置,向串口发送数据或者向串口接受数据:
void OpenComm()
{
hCom=CreateFile("COM3",GENERIC_READ|GENERIC_WRITE,0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
NULL);
}
void SetComm()
{
SetupComm(hCom,1024,1024);
DCB dcb;
dcb.BaudRate=115200;
dcb.fParity=NOPARITY;
dcb.ByteSize=8;
dcb.StopBits=ONESTOPBIT;
GetCommState(hCom,&dcb);
if(!GetCommState(hCom,&dcb)){
std::cerr<<"串口被占用"<<std::endl;
return;
}
if(!SetCommMask(hCom,EV_RXCHAR|EV_TXEMPTY)){
std::cerr<<"掩码设置失败"<<std::endl;
}
}
void SendMessageOut(const BYTE snd[],int len)
{
DWORD factdata=100;
DWORD res=0;
wOverLapped.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL); //创建事件
BOOL tempflag = WriteFile(hCom,snd,len,&factdata,&wOverLapped);//在数据缓冲Ipbuffer不知道是否有问题
if(tempflag!=0)
{
std::cerr<<"等待信号"<<std::endl;
res=WaitForSingleObject(wOverLapped.hEvent,5000);
WriteFile(hCom,snd,len,&factdata,&wOverLapped);
}
if(res!=WAIT_OBJECT_0)
std::cout<<"数据发送失败"<<std::endl;
}
这是向串口发送数据的,主要函数为WriteFile();读取ReadFile(),具体用法 网络一下
Ⅱ 如何在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开发(五十)——QT串口编程基础
一、QtSerialPort简介
1、串口通信基础
目前使用最广泛的串口为DB9接口,适用于较近距离的通信。一般小于10米。DB9接口有9个针脚。
串口通信的主要参数如下:
A、波特率:衡量通信速度的参数,表示每秒钟传送的bit的个数。例如9600波特表示每秒钟发送9600个bit。
B、数据位:衡量通信中实际数据位的参数,当计算机发送一个信息包,实际包含的有效数据位个数。
C、停止位:用于表示单个包的最后一位。典型的值为1和2位。
D、奇偶校验位:串口通信中一种检错方式。常用的检错方式有:偶、奇校验。
2、QtSerialPort模块简介
QtSerialPort模块是QT5中附加模块的一个模块,为硬件和虚拟的串口提供统一的接口。
串口由于其简单和可靠,目前在像嵌入式系统、机器人等工业中依旧用得很多。使用QtSerialPort模块,开发者可以大大缩短开发串口相关的应用程的周期。
Qt SerialPort提供了基本的功能,包括配置、I/O操作、获取和设置RS-232引脚的信号。
Qt SerialPort模块暂不支持以下特性:
A、终端的特性,例如回显,控制CR/LF等等
B、文本模式
C、读或写操作的超时和延时配置
D、当RS-232引脚信号变化通知
#include <QtSerialPort/QtSerialPort>
要链接QtSerialPort模块,需要在.pro文件中添加如下内容:
QT += serialport
二、QSerialPort
1、QSerialPort简介
QSerialPort提供了访问串口的接口函数。使用辅助类QSerialPortInfo可以获取可用的串口信息。将QSerialPortInfo辅助类对象做为参数,使用setPort()或setPortName()函数可以设置要访问的串口设备。
设置好端口后,可以使用open()函数以只读、只写或读写的模式打开使用。
注意,串口使用独占方式打开。
使用close()函数关闭串口并且取消IO操作。
串口成功打开后,QSerialPort会尝试确定串口的当前配置并初始化。可以使用setBaudRate()、setDataBits()、setParity()、setStopBits()和setFlowControl()函数重新配置端口设置。
有一对名为QSerialPort::dataTerminalReady、QSerialPort::requestToSend的属性
QSerialPort提供了中止正在调用线程直到信号触发的一系列函数。这些函数用于阻塞串口。
waitForReadyRead():阻塞调用,直到有新的数据可读
waitForBytesWritten():阻塞调用,直到数据以及写入串口
阻塞串口编程与非阻塞串口编程完全不同。阻塞串口不会要求时间循环并且通常会简化代码。然而,在GUI程序中,为了避免冻结用户界面,阻塞串口编程只能用于非GUI线程。
QSerialPort也能使用QTextStream和QDataStream的流操作符。在试图使用流操作符>>读时,需要确保有足够可用的数据。
2、QSerialPort成员函数
QSerialPort::QSerialPort(QObject *parent = Q_NULLPTR)
QSerialPort::QSerialPort(const QString &name, QObject *parent = Q_NULLPTR)
QSerialPort::QSerialPort(const QSerialPortInfo &serialPortInfo, QObject *parent = Q_NULLPTR)
[virtual] bool QSerialPort::atEnd() const
[signal] void QSerialPort::baudRateChanged(qint32 baudRate, QSerialPort::Directions directions)
[virtual] qint64 QSerialPort::bytesAvailable() const
[virtual] qint64 QSerialPort::bytesToWrite() const
[virtual] void QSerialPort::close()
void QSerialPort::setPort(const QSerialPortInfo &serialPortInfo)
void QSerialPort::setPortName(const QString &name)
三、QSerialPortInfo
1、QSerialPortInfo简介
QSerialPortInfo类提供已有串口设备的信息。使用QSerialPortInfo类的静态成员函数生成QSerialPortInfo对象的链表。链表中的每个QSerialPortInfo对象代表一个串口,每个串口可以使用端口名、系统定位、描述、制造商查询。QSerialPortInfo类对象也可以用做QSerialPort类的setPort()成员函数的参数。
2、QSerialPortInfo成员函数
QSerialPortInfo::QSerialPortInfo(const QSerialPort &port)
QSerialPortInfo::QSerialPortInfo(const QString &name)
QSerialPortInfo::QSerialPortInfo(const QSerialPortInfo &other)
[static] QList<QSerialPortInfo> QSerialPortInfo::availablePorts()
QString QSerialPortInfo::description() const
bool QSerialPortInfo::hasProctIdentifier() const
bool QSerialPortInfo::hasVendorIdentifier() const
bool QSerialPortInfo::isBusy() const
QString QSerialPortInfo::manufacturer() const
QString QSerialPortInfo::portName() const
quint16 QSerialPortInfo::proctIdentifier() const
QString QSerialPortInfo::serialNumber() const
[static] QList<qint32> QSerialPortInfo::standardBaudRates()
void QSerialPortInfo::swap(QSerialPortInfo &other)
QString QSerialPortInfo::systemLocation() const
quint16 QSerialPortInfo::vendorIdentifier() const
3、QSerialPortInfo显示串口信息实例
Ⅳ 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);
Ⅵ qt中,与串口通讯,使用什么方法
看来你是软硬件通吃啊 上位机也自己写啊 我是这样想的 1,你先确定下波特率上位机和单片机是否一致 2,能否把单片机收到的串口数据通过其他方式显示出来 或者直接用keil或iar仿真看你收到的是不是0x11 如果不是那就从qt发送部分找问题
Ⅶ QT串口数据传输
这三个中应该有主界面的吧,主界面分发下去就好了啊
Ⅷ 如何在在QT中写一个对RS232串口进行初始化、读和写的函数
您好,单击主界面中的【设置】按钮,将弹出“设置”对话框,如图所示,可以在该对话框中设置串口的通信参数。
//AfxMessageBox(strPara);
m_mscom.put_Settings(strPara); //通信参数设置 m_mscom.put_InBufferSize(1024); //指定接收缓冲区大小 m_mscom.put_InBufferCount(0); //清空接收缓冲区 m_mscom.put_InputMode(1); //设置数据获取方式。
Ⅸ qt stm32上位机串口通信
1、首先,新建一个Qt项目:文件--新建文件。
Ⅹ QT串口通讯
不知道发送你上面写的ascii码和发送16进制数据有什么区别??
不知道你在说些什么。表达太差