博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
4、Qt Project之串口数据传输
阅读量:4495 次
发布时间:2019-06-08

本文共 9949 字,大约阅读时间需要 33 分钟。

串口数据传输:

Step1:串口数据的发送和接收过程,我们需要单独的添加串口的相关模块进去,模块名称叫做serialport,我们需要建立的工程是QMainWindow的基类程序,不是QWidget程序

我们添加的位置是在xxx.pro文件当中,改文件如前所述,是包含当前工程所需要的核心模块的文件:

QT += core gui serialport

这里添加了core、gui、serialprot三个核心需要使用到的模块。

Step2:完成整个串口通讯程序的UI界面的设计工作:

MainWindow
0
0
473
382
MainWindow
0
0
321
51
28
true
false
false
BlankCursor
Qt interface Demo!
Qt::AlignCenter
0
50
171
51
16
true
false
false
BlankCursor
SerialPort Control
Qt::AlignCenter
10
100
171
21
10
true
false
false
BlankCursor
Designed by : mm1994uestc
Qt::AlignCenter
10
210
91
17
Send Content
0
250
111
17
Recieve Content
120
200
231
31
120
240
231
81
360
200
98
27
SEND
360
260
98
27
CLEAR
280
80
78
27
115200
57600
38400
19200
9600
4800
2400
1200
290
60
61
17
Baud Set
200
60
65
17
Port Set
190
80
78
27
380
80
78
27
8
7
6
5
390
60
61
17
Data Bit
190
150
78
27
None
Even
Odd
Mark
Space
190
130
81
20
Data Parity
280
150
78
27
1
1.5
2
290
130
61
17
Stop Bit
380
150
78
27
NoFlowCtl
SoftWareCtl
HardWareCtl
370
130
121
17
Stream Control
20
130
71
71
Start/Stop
0
0
473
25
TopToolBarArea
false
View Code

整个界面的大致情况如下所示:

这里,我们已经看到了程序读取到的串口好:ttyUSB0这个串口

Step3:根据上面完成的界面,我们需要在mainwindow.cpp文件中实现每一个按键的触发信号和槽函数的实现,并使用connect函数见他们连接起来

void MainWindow::Read_Data()

void MainWindow::Read_Data(){    QByteArray buf;    buf = PortParam.readAll();    if(!buf.isEmpty())    {        QString str = this->ui->Recieve_Text->toPlainText();        str += tr(buf);        this->ui->Recieve_Text->clear(); this->ui->Recieve_Text->append(str); } buf.clear(); }

void MainWindow::on_Start_Stop_Button_clicked(bool checked) //on_Port_Set_currentIndexChanged

void MainWindow::on_Start_Stop_Button_clicked(bool checked) //on_Port_Set_currentIndexChanged{    if(Start_Stop)    {        foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {            qDebug() << "Name :" << info.portName();            qDebug() << "Discription :" << info.description();            qDebug() << "Manufacturer :" << info.manufacturer(); } QString Port_Select = this->ui->Port_Set->currentText(); int Port_BaudRate = this->ui->BaudRate->currentIndex(); int Data_Bit = this->ui->DataBit->currentIndex(); int Check_Bit = this->ui->CheckBit->currentIndex(); int Stop_Bit = this->ui->StopBit->currentIndex(); int Stream_Contrl = this->ui->Stream->currentIndex();  QSerialPort::BaudRate baudrate; switch (Port_BaudRate) { case 0: baudrate = QSerialPort::Baud115200; break; case 1: baudrate = QSerialPort::Baud57600; break; case 2: baudrate = QSerialPort::Baud38400; break; case 3: baudrate = QSerialPort::Baud19200; break; case 4: baudrate = QSerialPort::Baud9600; break; case 5: baudrate = QSerialPort::Baud4800; break; case 6: baudrate = QSerialPort::Baud2400; break; case 7: baudrate = QSerialPort::Baud1200; break; default: break; } QSerialPort::DataBits databit; switch(Data_Bit){ case 0: databit = QSerialPort::Data5; break; case 1: databit = QSerialPort::Data6; break; case 2: databit = QSerialPort::Data7; break; case 3: databit = QSerialPort::Data8; break; default: break; } QSerialPort::FlowControl flowcontrol; switch(Stream_Contrl){ case 0: flowcontrol = QSerialPort::NoFlowControl; break; case 1: flowcontrol = QSerialPort::SoftwareControl; break; case 2: flowcontrol = QSerialPort::HardwareControl; break; default : break; } QSerialPort::StopBits stopbit; switch(Stop_Bit){ case 0: stopbit = QSerialPort::OneStop; break; case 1: stopbit = QSerialPort::TwoStop; break; case 2: stopbit = QSerialPort::OneAndHalfStop; break; default: break; } QSerialPort::Parity checkbit; switch(Check_Bit){ case 0: checkbit = QSerialPort::NoParity; break; case 1: checkbit = QSerialPort::EvenParity; break; case 2: checkbit = QSerialPort::OddParity; break; case 3: checkbit = QSerialPort::MarkParity; break; case 4: checkbit = QSerialPort::SpaceParity; break; default: break; } qDebug() << "BaudRate:" << Port_BaudRate; qDebug() << "Data Bit:" << Data_Bit; qDebug() << "Stop Bit:" << Stop_Bit; qDebug() << "FlowControl:" << Stream_Contrl; qDebug() << "Data Parity:" << Check_Bit; foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) { if(info.portName() == Port_Select) { PortParam.setPort(info); //Set Serial Port  PortParam.setPortName(Port_Select); if(PortParam.open(QIODevice::ReadWrite)) { PortParam.setBaudRate(baudrate); //Set Serial Port BaudRate PortParam.setDataBits(databit); // Set Port Data Bit  PortParam.setFlowControl(flowcontrol); PortParam.setStopBits(stopbit); PortParam.setParity(checkbit); QObject::connect(&PortParam,&QSerialPort::readyRead,this,&MainWindow::Read_Data); PortParam.clearError(); PortParam.clear(); qDebug() << "Port Opened!"; }else { qDebug() << "No port Opened!"; } } } }else { PortParam.close(); qDebug() << "Port Closed!"; } Start_Stop = !Start_Stop; }

void MainWindow::on_Send_clicked(bool checked)

void MainWindow::on_Send_clicked(bool checked){    QString T;    QByteArray Temp;    char *Data;    int len,i;    len = this->ui->Send_Text->toPlainText().size();    T = this->ui->Send_Text->toPlainText();    Temp = T.toLatin1(); Data = Temp.data(); qDebug() << len; qDebug() << T; for(i=0;i

void MainWindow::on_Clear_clicked(bool checked)

void MainWindow::on_Clear_clicked(bool checked){    this->ui->Recieve_Text->clear();}

Step4:下面使用connect函数将他们和信号连接起来:

connect(this->ui->Start_Stop_Button,SIGNAL(clicked(bool)),this,SLOT(on_Start_Stop_Button_clicked(bool checked)));connect(this->ui->Send,SIGNAL(clicked(bool)),this,SLOT(on_Send_clicked(bool checked)));connect(this->ui->Clear,SIGNAL(clicked(bool)),this,SLOT(on_Clear_clicked(bool)));

注1:以上步骤基本完成了Qt的Serialport的相关设计,但是我们发现在打开串口的过程当中总是存在这串口打不开的情况,这里我们在电脑的USB口上插入的是PL2303的串口芯片检查并解决如下:

从上图可以看出,我们的确找到了需要的ttyUSB0设备,但是/dev/ttyUSB0的文件对象的权限是普通用户不可以执行不可读写的状态,我们需要对它进行修改,修改之后就能顺利的使用我们的串口芯片了。

注2:关于如何在Ubuntu下如何安装Serialport模块,可以参看我的这篇博客

转载于:https://www.cnblogs.com/uestc-mm/p/8946722.html

你可能感兴趣的文章
python 解析Excel
查看>>
$_SERVER
查看>>
Lambda表达式-使用说明
查看>>
【第一篇:C++与opencv】图片的读取和显示
查看>>
PV inverter启动 ----系列一
查看>>
Windows 8在Vmware 8 中安装提示:windows cannot read the<product key> setting from the unattend answer...
查看>>
牛客训练六:海啸(二维树状数组+vector函数的使用)
查看>>
css重要属性float学习
查看>>
今天 了解了一下 但是看不到解析xml的底层代码 也没什么东西
查看>>
连接运算符
查看>>
二级LOGO设计代表什么
查看>>
清除sql server2000/2005/2008数据库日志的方法
查看>>
1-3 并发与高并发基本概念.mkv
查看>>
R 连接DB2数据库,并制作词图
查看>>
Struts 2基础知识
查看>>
SQL语法
查看>>
适配器模式(默认适配器)
查看>>
Nginx 配置简述
查看>>
NPOI 导入excel
查看>>
字符测试与映射函数 ctype.h
查看>>