前言:如果用qt写程序作为上位机,然后通过和usb和下位机通信的时候,就需要用到qt中的串口通信了。
使用qt中的串口通信的时候需要用到的两个头文件分别为:
#include <QtSerialPort/QSerialPort> #include <QtSerialPort/QSerialPortInfo>
除了加上面两个头文件之外,还需要在工程文件中加下面一行代码:
QT += serialport
我们一般都需要先定义一个全局的串口对象,记得在自己的头文件中添加上:
QSerialPort *serial;
到这里我们就可以调用qt串口通信中的函数了,一般来讲qt串口通信需要经过7步:
1、设置串口名(如COM1)
serial = new QSerialPort; serial->setPortName(ui->PortBox->currentText());
这里我使用自动寻找可用串口的方法,直接自动设置了
![复制代码](https://img-blog.csdnimg.cn/img_convert/8e37cfe3694b9a2e40b734fbb1088731.gif)
foreach (const QSerialPortInfo &info,QSerialPortInfo::availablePorts()) { QSerialPort serial; serial.setPort(info); if(serial.open(QIODevice::ReadWrite)) { ui->PortBox->addItem(serial.portName()); serial.close(); } }
![复制代码](https://img-blog.csdnimg.cn/img_convert/78ab7e58b9ec33660ac0c3042bb3a0c7.gif)
2、打开串口
serial->open(QIODevice::ReadWrite);
3、设置波特率(如115200)
serial->setBaudRate(QSerialPort::Baud115200);//设置波特率为115200
4、设置数据位(如8)
serial->setDataBits(QSerialPort::Data8);//设置数据位8
5、设置校验位(如0)
serial->setParity(QSerialPort::NoParity); //校验位设置为0
6、设置停止位(如1)
serial->setStopBits(QSerialPort::OneStop);//停止位设置为1
7、设置流控制
serial->setFlowControl(QSerialPort::NoFlowControl);//设置为无流控制
到这里串口通信的设置就完成了,下面我们需要实现对数据的发送和接收
1、连接数据接收槽函数,下位机中一有数据发送过来的时候就会响应这个槽函数
QObject::connect(serial,&QSerialPort::readyRead,this,&MainWindow::ReadData);
2、从上位机发送数据到下位机
serial->write(ui->textEdit_2->toPlainText().toLatin1());
主要使用的函数就这些了,我们来看看代码:
1、工程文件SerialPortTool.pro
![](https://img-blog.csdnimg.cn/img_convert/0bc60b865874e3eead624f2757e8750a.gif)
View Code
2、头文件mainwindow.h
![](https://img-blog.csdnimg.cn/img_convert/f21a01083ac9cb3519760e72295f8b97.gif)
View Code
3、源文件mainwindow.cpp
![](https://img-blog.csdnimg.cn/img_convert/0bc60b865874e3eead624f2757e8750a.gif)
View Code
4、界面文件mainwindow.ui
![](https://img-blog.csdnimg.cn/img_convert/ba2b9f6f6f3c64469b4337f8f8ddcb6a.gif)
View Code
效果图如下,自己设置对应下位机的波特率就可以实现数据收发了
![](https://img-blog.csdnimg.cn/img_convert/27c8ca9d04548daafbf83c2a34788f4a.png)
这里注意一下,使用串口通信的时候是按字节发送的,所以如果你定义一个char buff[10],而且你想这样定义buff[0] = '255'发送255这个字符给下位机的时候,下位机是接收不完整的,经过测试发现发送大于或等于10的字符是会被截断的,只会留下最后一个字符,比如说发送10字符的时候,下位机很有可能只能接收到0这个字符,当然如果想要完整的发送过去的话可以定义成字符串形式。比如char buff[] ="255",这样就可以发送一个完整的255过去了,但是需要注意的是这是一个字符串不是一个字符,所以如果你在下位机如果要根据上位机发送的数据来处理一些事情的时候一定要清楚你发送的是字符还是字符串。