zoukankan      html  css  js  c++  java
  • 4、Qt Project之串口数据传输

    串口数据传输:

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

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

    QT += core gui serialport

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

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

    <?xml version="1.0" encoding="UTF-8"?>
    <ui version="4.0">
     <class>MainWindow</class>
     <widget class="QMainWindow" name="MainWindow">
      <property name="geometry">
       <rect>
        <x>0</x>
        <y>0</y>
        <width>473</width>
        <height>382</height>
       </rect>
      </property>
      <property name="windowTitle">
       <string>MainWindow</string>
      </property>
      <widget class="QWidget" name="centralWidget">
       <widget class="QLabel" name="label_6">
        <property name="geometry">
         <rect>
          <x>0</x>
          <y>0</y>
          <width>321</width>
          <height>51</height>
         </rect>
        </property>
        <property name="font">
         <font>
          <pointsize>28</pointsize>
          <italic>true</italic>
          <underline>false</underline>
          <strikeout>false</strikeout>
         </font>
        </property>
        <property name="cursor">
         <cursorShape>BlankCursor</cursorShape>
        </property>
        <property name="text">
         <string>Qt interface Demo!</string>
        </property>
        <property name="alignment">
         <set>Qt::AlignCenter</set>
        </property>
       </widget>
       <widget class="QLabel" name="label_5">
        <property name="geometry">
         <rect>
          <x>0</x>
          <y>50</y>
          <width>171</width>
          <height>51</height>
         </rect>
        </property>
        <property name="font">
         <font>
          <pointsize>16</pointsize>
          <italic>true</italic>
          <underline>false</underline>
          <strikeout>false</strikeout>
         </font>
        </property>
        <property name="cursor">
         <cursorShape>BlankCursor</cursorShape>
        </property>
        <property name="text">
         <string>SerialPort Control</string>
        </property>
        <property name="alignment">
         <set>Qt::AlignCenter</set>
        </property>
       </widget>
       <widget class="QLabel" name="label_4">
        <property name="geometry">
         <rect>
          <x>10</x>
          <y>100</y>
          <width>171</width>
          <height>21</height>
         </rect>
        </property>
        <property name="font">
         <font>
          <pointsize>10</pointsize>
          <italic>true</italic>
          <underline>false</underline>
          <strikeout>false</strikeout>
         </font>
        </property>
        <property name="cursor">
         <cursorShape>BlankCursor</cursorShape>
        </property>
        <property name="text">
         <string>Designed by : mm1994uestc</string>
        </property>
        <property name="alignment">
         <set>Qt::AlignCenter</set>
        </property>
       </widget>
       <widget class="QLabel" name="label">
        <property name="geometry">
         <rect>
          <x>10</x>
          <y>210</y>
          <width>91</width>
          <height>17</height>
         </rect>
        </property>
        <property name="text">
         <string>Send Content</string>
        </property>
       </widget>
       <widget class="QLabel" name="label_2">
        <property name="geometry">
         <rect>
          <x>0</x>
          <y>250</y>
          <width>111</width>
          <height>17</height>
         </rect>
        </property>
        <property name="text">
         <string>Recieve Content</string>
        </property>
       </widget>
       <widget class="QTextEdit" name="Send_Text">
        <property name="geometry">
         <rect>
          <x>120</x>
          <y>200</y>
          <width>231</width>
          <height>31</height>
         </rect>
        </property>
       </widget>
       <widget class="QTextEdit" name="Recieve_Text">
        <property name="geometry">
         <rect>
          <x>120</x>
          <y>240</y>
          <width>231</width>
          <height>81</height>
         </rect>
        </property>
       </widget>
       <widget class="QPushButton" name="Send">
        <property name="geometry">
         <rect>
          <x>360</x>
          <y>200</y>
          <width>98</width>
          <height>27</height>
         </rect>
        </property>
        <property name="text">
         <string>SEND</string>
        </property>
       </widget>
       <widget class="QPushButton" name="Clear">
        <property name="geometry">
         <rect>
          <x>360</x>
          <y>260</y>
          <width>98</width>
          <height>27</height>
         </rect>
        </property>
        <property name="text">
         <string>CLEAR</string>
        </property>
       </widget>
       <widget class="QComboBox" name="BaudRate">
        <property name="geometry">
         <rect>
          <x>280</x>
          <y>80</y>
          <width>78</width>
          <height>27</height>
         </rect>
        </property>
        <item>
         <property name="text">
          <string>115200</string>
         </property>
        </item>
        <item>
         <property name="text">
          <string>57600</string>
         </prop
    19:41:19 收到数据:erty>
        </item>
        <item>
         <property name="text">
          <string>38400</string>
         </property>
        </item>
        <item>
         <property name="text">
          <string>19200</string>
         </property>
        </item>
        <item>
         <property name="text">
          <string>9600</string>
         </property>
        </item>
        <item>
         <property name="text">
          <string>4800</string>
         </property>
        </item>
        <item>
         <property name="text">
          <string>2400</string>
         </property>
        </item>
        <item>
         <property name="text">
          <string>1200</string>
         </property>
        </item>
       </widget>
       <widget class="QLabel" name="label_3">
        <property name="geometry">
         <rect>
          <x>290</x>
          <y>60</y>
          <width>61</width>
          <height>17</height>
         </rect>
        </property>
        <property name="text">
         <string>Baud Set</string>
        </property>
       </widget>
       <widget class="QLabel" name="label_7">
        <property name="geometry">
         <rect>
          <x>200</x>
          <y>60</y>
          <width>65</width>
          <height>17</height>
         </rect>
        </property>
        <property name="text">
         <string>Port Set</string>
        </property>
       </widget>
       <widget class="QComboBox" name="Port_Set">
        <property name="geometry">
         <rect>
          <x>190</x>
          <y>80</y>
          <width>78</width>
          <height>27</height>
         </rect>
        </property>
       </widget>
       <widget class="QComboBox" name="DataBit">
        <property name="geometry">
         <rect>
          <x>380</x>
          <y>80</y>
          <width>78</width>
          <height>27</height>
         </rect>
        </property>
        <item>
         <property name="text">
          <string>8</string>
         </property>
        </item>
        <item>
         <property name="text">
          <string>7</string>
         </property>
        </item>
        <item>
         <property name="text">
          <string>6</string>
         </property>
        </item>
        <item>
         <property name="text">
          <string>5</string>
         </property>
        </item>
       </widget>
       <widget class="QLabel" name="label_8">
        <property name="geometry">
         <rect>
          <x>390</x>
          <y>60</y>
          <width>61</width>
          <height>17</height>
         </rect>
        </property>
        <property name="text">
         <string>Data Bit</string>
        </property>
       </widget>
       <widget class="QComboBox" name="CheckBit">
        <property name="geometry">
         <rect>
          <x>190</x>
          <y>150</y>
          <width>78</width>
          <height>27</height>
         </rect>
        </property>
        <item>
         <property name="text">
          <string>None</string>
         </property>
        </item>
        <item>
         <property name="text">
          <string>Even</string>
         </property>
        </item>
        <item>
         <property name="text">
          <string>Odd</string>
         </property>
        </item>
        <item>
         <property name="text">
          <string>Mark</string>
         </property>
        </item>
        <item>
         <property name="text">
          <string>Space</string>
         </property>
        </item>
       </widget>
       <widget class="QLabel" name="label_9">
        <property name="geometry">
         <rect>
          <x>190</x>
          <y>130</y>
          <width>81</width>
          <height>20</height>
         </rect>
        </property>
        <property name="text">
         <string>Data Parity</string>
        </property>
       </widget>
       <widget class="QComboBox" name="StopBit">
        <property name="geometry">
         <rect>
          <x>280</x>
          <y>150</y>
          <width>78</width>
          <height>27</height>
         </rect>
        </property>
        <item>
         <property name="text">
          <string>1</string>
         </property>
        </item>
        <item>
         <property name="text">
          <string>1.5</string>
         </property>
        </item>
        <item>
         <property name="text">
          <string>2</string>
         </property>
        </item>
       </widget>
       <widget class="QLabel" name="label_10">
        <property name="geometry">
         <rect>
          <x>290</x>
          <y>130</y>
          <width>61</width>
          <height>17</height>
         </rect>
        </property>
        <property name="text">
         <string>Stop Bit</string>
        </property>
       </widget>
       <widget class="QComboBox" name="Stream">
        <property name="geometry">
         <rect>
          <x>380</x>
          <y>150</y>
          <width>78</width>
          <height>27</height>
         </rect>
        </property>
        <item>
         <property name="text">
          <string>NoFlowCtl</string>
         </property>
        </item>
        <item>
         <property name="text">
          <string>SoftWareCtl</string>
         </property>
        </item>
        <item>
         <property name="text">
          <string>HardWareCtl</string>
         </property>
        </item>
       </widget>
       <widget class="QLabel" name="label_11">
        <property name="geometry">
         <rect>
          <x>370</x>
          <y>130</y>
          <width>121</width>
          <height>17</height>
         </rect>
        </property>
        <property name="text">
         <string>Stream Control</string>
        </property>
       </widget>
       <widget class="QPushButton" name="Start_Stop_Button">
        <property name="geometry">
         <rect>
          <x>20</x>
          <y>130</y>
          <width>71</width>
          <height>71</height>
         </rect>
        </property>
        <property name="text">
         <string>Start/Stop</string>
        </property>
       </widget>
      </widget>
      <widget class="QMenuBar" name="menuBar">
       <property name="geometry">
        <rect>
         <x>0</x>
         <y>0</y>
         <width>473</width>
         <height>25</height>
        </rect>
       </property>
      </widget>
      <widget class="QToolBar" name="mainToolBar">
       <attribute name="toolBarArea">
        <enum>TopToolBarArea</enum>
       </attribute>
       <attribute name="toolBarBreak">
        <bool>false</bool>
       </attribute>
      </widget>
      <widget class="QStatusBar" name="statusBar"/>
     </widget>
     <layoutdefault spacing="6" margin="11"/>
     <resources/>
     <connections/>
    </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

  • 相关阅读:
    NX 调试批处理文件
    NXOpen 更改UI对话框宽度
    NXOpen 遍历体 移动图层
    NXOpen 设置工作图层 一键开关图层
    NXOpen Block UI弹出另一个对话框实例
    NXOpen 座标UI获取 (原点 矩阵变换)
    [StackExchange]Redis 的几种类型的操作(string,hash,lists,set,sorted set)
    IIS 并发连接 设置与测试
    [StackExchage]Redis 的连接与操作(跨机器)
    Redis 事务
  • 原文地址:https://www.cnblogs.com/uestc-mm/p/8946722.html
Copyright © 2011-2022 走看看