4、Qt Project之串口数据传输

串口数据传输:

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

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

QT += core gui serialport

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

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

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<len;i++) { qDebug() << Data[i]; } qDebug() << Data[0] << Data[1] << Data[2]; PortParam.write(Data); }

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模块,可以参看我的这篇博客http://www.cnblogs.com/uestc-mm/p/8920525.html

猜你喜欢

转载自www.cnblogs.com/uestc-mm/p/8946722.html