串口(串行接口)简介

  1. 串口(Serial Port):串行通讯接口,采用串行通讯协议在信号线上将数据一个比特一个比特地逐位进行传输
  2. 串行接口按照电气标准及协议分为:
    1. RS-232:标准串口,最常用通讯串口,其传输距离最大为约15米,最高速率为20kb/s
    2. RS-422:最大传输距离为1219米,最大传输速率为10Mb/s
    3. RS-485:最大传输距离为1219米,最大传输速率为10Mb/s
  3. 串口通讯需要的参数:
    1. 端口:标识哪一个串口
    2. 波特率:表示传输速率
    3. 数据位
    4. 停止位
    5. 校验位
    6. 流控制

Qt之serialport模块

  1. 封装一个基于进行串口通信的工具类如下:
    1. 头文件如下:
    #pragma once
    
    #include <QSerialPort>
    #include <QDebug>
    #include <QThread>
    
    class SerialPortCommunication : public QSerialPort
    {
        Q_OBJECT
    public:
        SerialPortCommunication();
    
        //串口参数结构体
        typedef struct SerialPortSettings {
            QString name;       // 串口名
            BaudRate baudRate;  //波特率
            DataBits dataBits;  //数据位
            Parity parity;      //奇偶校验
            StopBits stopBits;  //停止位
            FlowControl flowControl;//流控制
        }Settings;
    
    public slots:
    
        //开启一个串口
        void  Start(const Settings& sets);
        //停止一个串口
        void  Stop();
        //向串口写数据
        void Send(QByteArray  data);
    
    signals:
        // 通知串口已开启
        void  sigStarted();
        // 通知串口已停止
        void  sigStoped(int  status);
        // 通知串口已收到数据
        void  sigReceived(QByteArray  data);
    };
    
    1. 实现如下:
    #include "SerialPortCommunication.h"
    
    SerialPortCommunication::SerialPortCommunication()
    {
        connect(this, &QSerialPort::readyRead, [this]
        {
    
           
            //收到串口数据
            QByteArray arr=  readAll();
            emit sigReceived(arr);
    
          /*
           //耗时工作
           int sum=0;
            for (int i=0;i<10000000;++i)
            {
                sum+=i;
            }
             qDebug()<<sum;
          */
    
    
        });
    }
    
    
    void  SerialPortCommunication::Start(const Settings& sets)
    {
        //设置串口参数
      QSerialPort::setPortName(sets.name);
      QSerialPort::setParity(sets.parity);
      QSerialPort::setBaudRate(sets.baudRate);
      QSerialPort::setDataBits(sets.dataBits);
      QSerialPort::setStopBits(sets.stopBits);
      QSerialPort::setFlowControl(sets.flowControl);
    
    
      //打开串口
      if(QSerialPort::open(QIODevice::ReadWrite))
      {
            emit sigStarted();
      }
      else{
          //打开串口失败
          emit sigStoped(1);
      }
    
    }
    
    void  SerialPortCommunication::Stop()
    {
        //关闭串口
        if(QSerialPort::isOpen())
        {
             QSerialPort::close();
        }
    
         //正常停止传0
        emit sigStoped(0);
    
    }
    
    
    void SerialPortCommunication::Send(QByteArray  data)
    {
        if(QSerialPort::isOpen())
        {    //写数据
             QSerialPort::write(data);
        }
    }