【串口通信】学习笔记

什么是串口通信

串口通信就是串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但通信线路简单,只要一对传输线就可以实现双向通信,从而大大降低了成本,适用于远距离通信,但传送速度较慢。

串口通信的几个重要参数

波特率:这是一个衡量符号传输速率的参数。大多时候表示单位时间内传送的字符个数。
波特率与比特率:假设每个字符格式包含10位(1个起始位,1个停止位,8个数据位),波特率为240Bd,则比特率为10位*240个/秒=2400bps。
波特率与距离:波特率和距离成反比。故高波特率常常用于放置的很近的仪器间的通信。

数据位:计算机发送的一个信息包,实际的数据往往不会是8位的,标准的值是6、7和8位。
数据位长度取值:取决于传送的信息。如,标准的ASCII码是0~127(7位)。扩展的ASCII码是0~255(8位)。

停止位:用于表示单个包的最后一位。典型的值为1,1.5和2位。
停止位的两个作用:一、表示传输的结束;二、由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。停止位可以提供计算机校正时钟同步的机会。

奇偶校验位:串口通信中一种简单的检错方式。常常通过在数据位后添加一位确保整个数据位逻辑高的奇偶个数。假设数据位是011,对于偶校验,添加校验位0,可以保证逻辑高的位数是偶数个。对于奇校验,添加校验位1,这样就有3个(奇数个)逻辑高位。

串口通信在嵌入式中的实现

数据在本质上是一个个高低电平,通过串口通信读入的字符会被存储在DR(Data Register,数据缓冲寄存器)内中,即将高低电平钳制在DR中,并通过补充电流保持电平的高低性。
DR由两个寄存器组成的,一个给发送用(TDR),一个给接收用(RDR)。每个寄存器只能存储一个字符,为了不让这个数据被新数据覆盖,常见的作法是将该数据存寄存器中取出存入buffer中。取寄存器中的数据的时机可以通过轮询或事件(中断)决定。
轮询:在判断获得停止位后,会标记传输标志位。所谓轮询就是CPU不断去询问传输标志位,当发现传输标志位被标记后即完成一次数据传入。
事件(中断):在完成一次数据传入时,不仅会标记传输标志位,同时会触发一次硬件级别的串口中断。由于是硬件级别的操作,相较于轮询,事件(中断)的响应时间会短很多。

串口的使用
ser = serial.Serial(port, bitrate, timeout=timeout)  # 实例化串口
ser.write(b'XXX')  # 通过串口发送数据
ser.read(size=XXX)  # 通过串口读取数据
serial_com.py
# -*-coding: utf-8 -*-
import threading, time, serial

port = "COM1"  # 串口
bitrate = 115200  # 波特率
timeout = 0.05  # 超时时间
ser = serial.Serial(port, bitrate, timeout=timeout)


def SerialThread():
    lock = threading.Lock()  # 申请一把锁

    def thread_1():
        while True:
            time.sleep(1)
            with lock:  # 为共享数据上锁,防止同时处理时产生错误
                ser.write(b'666\r\n')

    def thread_2():
        while True:
            Recv = ser.read(size=10)
            if Recv != b'':
                print(Recv)

    th1 = threading.Thread(target=thread_1, args=())  # 实例化线程
    th2 = threading.Thread(target=thread_2, args=())
    th1.start()  # 启动线程
    th2.start()


SerialThread()

使用工具

通常收发串口数据需要特定的硬件支持,为了方便调试,我们这里可以使用虚拟软件进行模拟调试(以下为我上传的免费资源,方便各位学习使用,由于是非正规途径,所以只能用于学习,严禁用于商业)

虚拟串口
串口工具

结果展示

Virtual Serial Port
XCOM
Recv Data

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值