1. 串口用途
1.打印调试信息
2.外接各种模块(GPS 、蓝牙等模块)
要想将开发板和电脑项链只需要三条线即可
2. 串口发送数据流程
假设arm开发板(TTL电平)要发送一个字节(1Byte,比如一个字符A)的数据给pc机,详细过程怎样?
开始传输数据(ARM开发板的TXD引脚接到PC机的RXD引脚):
1 > 一开始TXD电平为高电平,当arm开发板要发送数据时,就会把TXD电平拉低,维持传输1bit所需要的时间
2> 拉低的瞬间pc机开始计时
3 > arm根据数据的每一位驱动TXD电平
TXD = Data[0]
TXD = Data[1]
…
TXD = Data[7]
比方说发 'A'
,A的ASSIC是0x41,二进制是0b 01000001
4 > PC机读取数据:在每一位数据位的中间读取引脚状态,即
Data[0] = RXD[t0]
Data[1] = RXD[t1]
…
Data[7] = RXD[t7]
5 > 校验位:检验为分奇偶检验为:数据位+校验位中为1的位的个数是奇还是偶
6 > 停止位:停止位的作用是将电平回复到初始时的电平,即完成传输。
1. 波特率
双方先约定好每一位所占据的时间,这就是波特率。每一位所占据的时间t=1/波特率,比如波特率为115200,t = 1/115200。
2. 格式:数据位、停止位、校验位、流量控制
数据位:即数据的每一位
停止位:用于恢复初始状态
3. 题外话
1.我们的开发板一般都是TTL电平,但是电脑是RS232逻辑电平,那么怎么连?
这种情况开发板里面会有一个电平转换芯片,自动帮我们转换好。不过现在大多数都直接采用usb。
2.知道波特率怎么算每秒可以传送多少数据
经常会看见115200,8n1这种格式,这种传输1Byte的数据需要10位(开始位+数据位+停止位)
每一位需要的时间t_bit = 1/115200;
传输1Byte需要10位,所以传输1Byte需要的时间t_per_Byte = 10*t_bit = 1/11520
一秒钟可以传输多少位:1/t_per_Byte = 11520;
3.TTY体系中设备节点的差别
/dev/ttyS0、/dev/ttySAC0、/dev/tty、/dev/tty0、/devtty1、/dev/console
它们有什么区别?
TTY/Terminal/Console/UART
他们有什么区别?
设备节点 | 含义 |
---|---|
/dev/ttyS0、/dev/ttySAC0 | 串口 |
/dev/tty1、/dev/tty2、/dev/tty3、…… | 虚拟终端设备节点 |
/dev/tty0 | 前台终端 |
/dev/tty | 程序自己的终端,可能是串口、也可能是虚拟终端 |
/dev/console | 控制台,由内核的cmdline参数确定 |
术语 | 含义 |
---|---|
TTY | 来自teletype,最古老的输入输出设备,现在用来表示内核的一套驱动系统 |
Terminal | 终端,暗含远端之意,也是一个输入输出设备,可能是真实设备,也可能是虚拟设备 |
Console | 控制台,含控制之意,也是一种Terminal,权限更大,可以查看内核打印信息 |
UART | 串口,它的驱动程序包含在TTY驱动体系之内 |
4. linux串口应用编程
在Linux系统中,操作设备的统一接口就是:open/ioctl/read/write。
对于UART,又在ioctl之上封装了很多函数,主要是用来设置行规程。
所以对于UART,编程的套路就是:
▲ open
▲ 设置行规程,比如波特率、数据位、停止位、检验位、RAW模式、 一有数据就返回
▲ read/write
学会了再写…