串口数据传输:
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
整个界面的大致情况如下所示:
这里,我们已经看到了程序读取到的串口好: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模块,可以参看我的这篇博客: