Qt串口通信
Qt串口通信
Qt串口通信
串口通信被广泛应用于以下领域:
- 电子设备:串口通信用于连接电脑与外部设备,如打印机、扫描仪、传感器、测量仪器等。
- 通信设备:串口通信用于连接调制解调器、路由器、交换机等网络设备。
- 工业自动化:串口通信用于连接工业机器人、PLC(可编程逻辑控制器)、传感器、仪器仪表等设备,实现数据采集、控制与监测。
- 仪器仪表:串口通信用于连接各类仪器仪表,如温度计、压力计、流量计等,传输数据并进行监测与控制。
- 汽车电子:串口通信用于连接汽车中各种电子部件,如发动机控制单元、车载导航系统、车载娱乐系统等。
- 安防监控:串口通信用于连接摄像头、监控器、报警设备等安防设备,实现数据传输与控制。
- 医疗设备:串口通信用于连接医疗仪器设备,如心电图仪、血压计、血糖仪等,传输患者的生理数据。
总之,串口通信在各个领域中被广泛应用,在数据传输、设备控制和监测等方面起到重要作用。
这些看看就好了,我们直接上代码!!!!
UI界面设计
我直接截图了,大家可以根据我的设计
我们设计的简单一些,其实如果是检测温度、打开开关这些功能,其实都不用下面的发送窗口,因为,完全没有必要,工业级的采集器是直接可以采集数据然后通过协议直接通信的。我们的这个界面其实跟像是一个串口工具,不过它可以帮我们了解功能也够了。
好了!!上代码!!!
编写代码
.pro文件
我们要使用串口通信,就要调用模块
QT += core gui serialport
widget.h文件
我们引入串口通信的头文件还有串口信息类的头文件,因为我们监测我们开发板或者电脑上的串口情况。
#include"QSerialPort"//串口类
#include"QSerialPortInfo"//串口信息类
全代码
在这里我们声名QserialPort的对象,然后我们还定义了一个槽函数,因为我们要接收我们接收到的信息,也就是我们的readData(),其他的就是转到槽了, 切记:我们的打开串口的按钮转到槽,奥选择第二个加bool参数的那个槽函数!!!
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include"QSerialPort"//串口类
#include"QSerialPortInfo"//串口信息类
QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_pushButton_clicked(bool checked);
void readData();
void on_pushButton_2_clicked();
void on_pushButton_3_clicked();
private:
Ui::Widget *ui;
QSerialPort *serialPort;
};
#endif // WIDGET_H
widget.cpp
代码讲解
1.头代码
这里我们的定义这个声名的对象,之后使用foreach这个方法,将我们电脑或开发板上的串口数据都显示在我们要实现的UI界面上,因为我们不能直接定义上面的数据
{
ui->setupUi(this);
serialPort = new QSerialPort(this);
//扫描本机串口将其添加到下拉框中
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
ui->comboBox->addItem(info.portName());
}
}
2.主代码编写
开始我们设计了他的串口名称、波特率、停止位、数据位、校验位这些,这里使用了switch方法是因为我们的校验位用了如下的格式,我们使用switch的方法可以使用index引用的方法来调用相应的方法,简单、方便~哎·~~~~爽了~~~嘿嘿~~~。
之后还有一个流控,这个是帮助文档中的,我之前写的时候都不用,为了别出错还是加上吧。
最后就是加了一个Connect方法来将我们的信号和槽连接,这里连接的是接收的信号 (通俗的就是说我们声名了一个槽——readData,我们用serialPotr的readyread方法读到数据后用readData调用)
要是还不明白细节,直接复制代码上chatgpt、文心都阔以!!!!
//打开串口
void Widget::on_pushButton_clicked(bool checked)
{
if(checked){
serialPort->setPortName(ui->comboBox->currentText());
serialPort->setBaudRate(ui->comboBox_2->currentText().toInt());
serialPort->setStopBits(QSerialPort::StopBits( ui->comboBox_3->currentText().toInt()));
serialPort->setDataBits(QSerialPort::DataBits( ui->comboBox_3->currentText().toInt()));
switch (ui->comboBox_5->currentIndex()) {
case 0:
serialPort->setParity(QSerialPort::NoParity);
break;
case 1:
serialPort->setParity(QSerialPort::EvenParity);
break;
case 2:
serialPort->setParity(QSerialPort::OddParity);
break;
case 3:
serialPort->setParity(QSerialPort::SpaceParity);
break;
case 4:
serialPort->setParity(QSerialPort::MarkParity);
break;
default:
break;
}
//设置流控
serialPort->setFlowControl(QSerialPort::NoFlowControl);
if(!serialPort->open(QIODevice::ReadWrite)){
QMessageBox::about(this,"错误","串口打开错误!!!!!");
return;
}
ui->comboBox->setEditable(false);
ui->comboBox_2->setEditable(false);
ui->comboBox_3->setEditable(false);
ui->comboBox_4->setEditable(false);
ui->comboBox_5->setEditable(false);
ui->pushButton->setText("关闭串口");
}else{
serialPort->close();
ui->comboBox->setEditable(true);
ui->comboBox_2->setEditable(true);
ui->comboBox_3->setEditable(true);
ui->comboBox_4->setEditable(true);
ui->comboBox_5->setEditable(true);
ui->pushButton->setText("打开串口");
}
//读取数据
connect(serialPort,SIGNAL(readyRead()),this,SLOT(readData()));
}
3.槽函数
这玩意就不用讲了吧!!!
void Widget::readData()
{
//接收数据
ui->textBrowser->insertPlainText(serialPort->readAll());
}
void Widget::on_pushButton_2_clicked()
{
//发送数据
serialPort->write(ui->textBrowser_2->toPlainText().toUtf8());
}
void Widget::on_pushButton_3_clicked()
{
//清空
ui->textBrowser_2->clear();
}