uart参数详细说明

本文详细介绍了Linux串口编程中如何设置串口的校验位,包括无校验、奇偶校验以及通过CMSPAR实现的space和mark校验。同时,解释了VMIN和VTIME参数的作用,如何配置以控制串口读取数据的行为,如阻塞等待、超时设定等。

一、串口应用编程

串口编写应用的流程,引用链接的图片:
在这里插入图片描述

二、设置校验位

校验相关的宏

PARENB:是否启用校验
PARODD:是否启用奇校验,不起用奇校验即使用偶校验
CSTOPB:是否启用space/mark校验,如果启用,结合PARODD确定校验位置1或置0

CSTOPB:置位表示使用2位停止位,否则1位

无校验

options.c_cflag &= ~PARENB
options.c_cflag &= ~CSTOPB

奇偶校验

奇校验

options.c_cflag |= PARENB;
options.c_cflag &= ~CSTOPB
options.c_cflag |= PARODD

偶校验

options.c_cflag |= PARENB
options.c_cflag &= ~CSTOPB
options.c_cflag &= ~PARODD

伪装方式实现space和mark校验

使用停止位总为1的特性,实现mark校验(待补充)

space和mark校验(需要内核支持)

Linux串口通讯(mark, space校验方式的实现)

space校验

options.c_cflag |= PARENB;
options.c_cflag |= CMSPAR;
options.c_cflag &= ~PARODD;

mark校验

options.c_cflag |= PARENB;
options.c_cflag |= CMSPAR;
options.c_cflag |= PARODD;

设置数据位

# 这里为什么要先清CSIZE?先清除其他标志,然后才设置位数
opt.c_cflag &= ~CSIZE;
# 设置数据位为8位,也可以是 CS5,CS6,CS7
opt.c_cflag |= CS8;

三、VMIN和VTIME

VMIN:[0-255]
VTIME:[0-255]
VMIN =0,VTIME=0:读不到数据,read立即返回。
VMIN!=0,VTIME=0:读到VMIN个数据才返回,否则阻塞等待。
VMIN!=0,VTIME!=0:读到VMIN个数据,或者从进入read后读第一个数据VTIME时间,任一满足返回,单位为0.1S。没有数据会阻塞。
VMIN=0,VTIME!=0:读不到数据,read阻塞vtime时间返回

串口VMIN VTIME 详解

### UART协议的详细介绍 #### 工作原理 UART(Universal Asynchronous Receiver/Transmitter)是一种通用异步收发传输器,主要用于实现计算机或其他微控制器与外部设备之间的串行通信。它通过将数据转换为一系列比特流来完成发送和接收操作[^2]。 在UART通信过程中,数据是以帧的形式进行传输的。每一帧通常由以下几个部分构成: - **起始位**:标志着一个新字节的到来。 - **数据位**:可以是5到9位,默认情况下为8位。 - **奇偶校验位**(可选):用于检测传输错误。 - **停止位**:标记当前字节的结束[^3]。 #### 数据传输机制 UART支持单工、半双工以及全双工模式下的数据交换。其中最常见的是全双工模式,在这种模式下,两个独立通道分别负责发送和接收数据[^1]。 为了确保双方能够同步理解所传递的信息内容,必须事先约定好一些基本参数,比如波特率、数据长度、是否有校验功能及其类型等。这些设置决定了如何解释接收到的电信号序列。 #### 技术特性 - **无需共享时钟信号**:由于采用了自同步方法,因此不需要额外增加一条专门用来同步时间基准的连线;只需要保证两端都按照相同的速度运行即可——这就是所谓的“异步”含义所在。 - **低成本解决方案**:仅需少量导线便可达成目标,简化了硬件设计复杂度的同时也降低了整体造价水平。 #### 应用场景 鉴于上述优点,UART广泛应用于各种嵌入式系统当中作为近距离低速外围接口之一选项。典型例子包括但不限于以下几种情况: - 微处理器连接至传感器模块; - 调试端口用途; - GPS装置对接主机板卡等等[^2]。 ```python import serial ser = serial.Serial('/dev/ttyS0', baudrate=9600, bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE) if ser.isOpen(): try: while True: data = input('Enter message to send via UART:') ser.write(data.encode()) response = ser.readline().decode() print(f'Received from UART:{response}') except KeyboardInterrupt: ser.close() else: print("Failed to open the port.") ``` 上面展示了一段基于Python语言编写的小程序片段,该脚本实现了基础版本的UART双向交互逻辑。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值