串行通信——异步串行通信

目录

I、串口通信简介

一、定义

二、意义

三、分类

II、异步串行通信详解

一、数据格式

1. 起始位

2. 数据位

3. 奇偶校验位

4. 停止位

二、通信制式

1. 单工

2. 半双工

3. 全双工

三、通信速率


I、串口通信简介

一、定义

一条传输线上,数据以“位”为单位进行逐个传输,即为串行通信。

二、意义

并行通信控制简单、相对传输速度快,但由于传输线较多,长距离传输时成本高,因此仅适合短距离的数据传输;

相对的,在满足“传输速度 ≥ 最大需求速度”的前提下,使用串行通信便是大势所趋了。

三、分类

串行通信分为两种方式,异步串行通信同步串行通信

异步串行通信,是指发送方与接收方,使用各自的时钟控制数据发送和接收过程(为使双方收发协调,要求双方时钟尽可能一致);

同步串行通信,则是发送方时钟直接控制接收方时钟,使双方完全同步(同步方法有“外同步和自同步”两种)。

 

串行通信的最小传输单位是“位”,一次完整的“接收/发送”的最小单位是“字符”(单独收发一个位的数据,通常没有意义)。

  • 使用异步串行通信时,由于收发双方时钟不严格一致,所以每个字符都要用到起始位和停止位来作为字符开始和结束的标志,从而保证数据传输的准确性(由于每个字符都有开始和停止位,因此字符之间的时间间隔是任意的);
  • 使用同步串行通信时,由于收发双方时钟严格一致,所以仅在数据块(有效数据)传输的一开始和结束时,用到了开始符和结束符,在有效数据传输完毕后,发送空闲字符。

对比两种串行通信方式,同一数据块,后者仅在头尾处添加了开始与结束标记,因此后者的传输效率较高,但实现的硬件设备也更复杂,所以各设备之间,通常采用的还是异步串行通信方式。

接下来将详细介绍异步串行通信。

II、异步串行通信详解

一、数据格式

一次完整的“接收/发送”的最小单位是“字符”,我们将其称为一个字符帧,字符帧由四部分组成:起始位、数据位、校验位、停止位。

1. 起始位

起始位为0。

  • 通讯线在空闲状态时保持高电平,因此出现下降沿即可判定为数据传输开始;
  • 另外,由于数据位定长,且起始位在一次接收中只判定一次,所以不用担心数据位中的0误识别成起始位。

2. 数据位

数据位可以是5/6/7/8位,传输时低位在前、高位在后

3. 奇偶校验位

校验位可以省略,当需要使用校验位时:

  • 奇偶校验位为1或0;
  • 奇校验时,数据位、校验位中1的个数,应该是奇数;
  • 偶校验时,数据位、校验位中1的个数,应该是偶数。

4. 停止位

停止位为1。

  • 停止位可以是1位的长度、1.5位的长度、2位的长度(位数的本质含义是信号出现的时间,故可有分数位);
  • 另外,由于数据位定长,所以停止位位置固定可知,接收时只需判定停止位是否为1即可。

二、通信制式

1. 单工

数据仅能沿一个方向传输,不能实现反向传输(只能A→B,不能B→A)。

2. 半双工

数据可以沿两个方向传输,但同一时刻,只能接收或者发送。

3. 全双工

数据可以沿两个方向传输,且可以同时进行。

三、通信速率

  • 串口通讯的速率用波特率表示,定义为每秒传输二进制码的位数,单位是bps(位/秒);
  • 以9600bps为例,假设一个字符帧共有10位(1起始位、8数据位、1结束位),那么每秒钟能传输的最大字符数为“9600/10 = 960”;
  • 最大传输距离,与波特率成反比关系(9600bps,最大传输距离约为76m)。
  • 43
    点赞
  • 170
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在Qt中进行同步和异步串口通信,可以使用Qt的串口模块(QSerialPort)来实现。 对于同步串口通信,可以使用阻塞的方式进行。以下是一个简单的同步串口通信的示例: ```cpp #include <QCoreApplication> #include <QSerialPort> #include <QSerialPortInfo> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 查找可用的串口 QList<QSerialPortInfo> portList = QSerialPortInfo::availablePorts(); if (portList.isEmpty()) { qDebug() << "No serial ports found."; return 0; } // 打开串口 QSerialPort serial; serial.setPort(portList.first()); if (!serial.open(QIODevice::ReadWrite)) { qDebug() << "Failed to open serial port."; return 0; } // 设置串口参数 serial.setBaudRate(QSerialPort::Baud9600); serial.setDataBits(QSerialPort::Data8); serial.setParity(QSerialPort::NoParity); serial.setStopBits(QSerialPort::OneStop); serial.setFlowControl(QSerialPort::NoFlowControl); // 发送数据 QByteArray sendData = "Hello, serial port!"; serial.write(sendData); // 等待接收数据 if (serial.waitForReadyRead(3000)) { QByteArray receivedData = serial.readAll(); qDebug() << "Received data: " << receivedData; } else { qDebug() << "Timeout occurred while waiting for data."; } // 关闭串口 serial.close(); return a.exec(); } ``` 对于异步串口通信,可以使用Qt的信号槽机制来处理串口事件。以下是一个简单的异步串口通信的示例: ```cpp #include <QCoreApplication> #include <QSerialPort> #include <QSerialPortInfo> #include <QDebug> class SerialPortHandler : public QObject { Q_OBJECT public: SerialPortHandler(QObject *parent = nullptr) : QObject(parent) { // 查找可用的串口 QList<QSerialPortInfo> portList = QSerialPortInfo::availablePorts(); if (portList.isEmpty()) { qDebug() << "No serial ports found."; return; } // 打开串口 serial.setPort(portList.first()); if (!serial.open(QIODevice::ReadWrite)) { qDebug() << "Failed to open serial port."; return; } // 设置串口参数 serial.setBaudRate(QSerialPort::Baud9600); serial.setDataBits(QSerialPort::Data8); serial.setParity(QSerialPort::NoParity); serial.setStopBits(QSerialPort::OneStop); serial.setFlowControl(QSerialPort::NoFlowControl); // 连接串口的readyRead信号到槽函数 connect(&serial, &QSerialPort::readyRead, this, &SerialPortHandler::handleReadyRead); } ~SerialPortHandler() { // 关闭串口 serial.close(); } public slots: void handleReadyRead() { // 接收数据 QByteArray receivedData = serial.readAll(); qDebug() << "Received data: " << receivedData; } private: QSerialPort serial; }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); SerialPortHandler handler; return a.exec(); } #include "main.moc" ``` 在这个例子中,我们创建了一个名为SerialPortHandler的类,它继承自QObject,并处理串口的readyRead信号。在主函数中,我们创建了一个SerialPortHandler对象,从而启动了异步串口通信。 这只是Qt串口通信的基本示例,你可以根据自己的需求进行进一步的扩展和调整。希望对你有帮助!
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值