linux串口通信主要有哪些应用设计方案?
扫描二维码
随时随地手机看文章
串口通信作为一种最传统的通信方式,在工业自动化、通讯、控制等领域得到广泛使用。而Linux系统,作为一种流行的开源操作系统,也广泛应用于这些领域。本文将深度分析Linux的UART子系统,介绍如何实现一个完美的串口通信解决方案。
一、UART子系统概述
UART(Universal Asynchronous Receiver/Tranitter)是一种常见的串行通信协议,支持异步传输。UART接口被应用于所有的计算机上,从微控制器到工控机、服务器等设备。
Linux内核提供了UART子系统作为串行设备的核心实现。UART子系统的主要作用是管理和控制串行设备的读写,包括接口的标准化和通信流程的控制。它是Linux内核和用户空间之间交互的接口。在Linux内核中,UART子系统也是串行驱动的基础。
UART子系统有四个重要的组成部分,包括内核中的UART驱动程序、串口子系统、TTY驱动程序以及用户空间的工具。
1. 内核中的UART驱动程序
在Linux内核中,UART驱动程序掌管与串行设备的通信。它提供了串口通信的底层操作函数,可以调用串口驱动的开关、初始化、写、读、控制等各种操作。Linux中有许多UART驱动程序,每种驱动程序可以用于支持不同的串行设备。
2. 串口子系统
串口子系统提供了一个抽象的串行接口,它允许控制和管理所有共享同一个串口的设备。串口子系统通过设备文件/dev/ttySx或/dev/ttyUSBx访问。串口驱动程序控制串口设备的行为,而TTY驱动程序提供了编码和解码机制来解决通用字符设备驱动程序和串口驱动程序之间的差异。
3. TTY驱动程序
TTY驱动程序是一个通用字符设备驱动程序,它将技术细节屏蔽在内部并将其公开为标准接口,与不同设备的驱动程序兼容。对于串口设备,TTY驱动程序通过串口子系统中的解码器和编码器提供了UART协议支持。这种方式简化了通讯编程,让应用程序员可以更加轻松地与串行设备交互。
4. 用户空间工具
用户空间应用程序可通过读写串口设备的文件来与串口设备通信。可以使用标准C库函数和API调用,如open()、close()、read()和write()等。
二、实现串口通信
实现串口通信需要广泛的应用程序知识,具体步骤如下:
1. 打开串口设备文件
首先需要通过open()函数打开串口设备文件。设备名称如/dev/ttyS0或/dev/ttyS1等。
“`C
int fd = open(“/dev/ttyS0”, O_RDWR | O_NOCTTY);
“`
2. 配置串口设备参数
通过TCgetattr()和TCsetattr()等函数可以从控制终端获取或设置端口的属性。常用的属性包括波特率、字符大小、校验位和停止位等。
“`C
struct termios options;
tcgetattr(fd, &options);
options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
cfsetispeed(&options, B115200);
cfsetospeed(&options, B115200);
tcsetattr(fd, TCSANOW, &options);
“`
以上是一种常见的串口设备属性设置,包括字符长度为8bits,无校验位,1个停止位,波特率为115200等。
3. 读/写数据
读写串口设备数据时,可以使用read()和write()函数。这些函数可以在指定的时间内等待读/写完成。
“`C
char buf[255];
int len = read(fd, buf, sizeof(buf));
write(fd, buf, len);
“`
4. 关闭串口设备
当完成串口通信后,应该使用close()函数关闭串口设备。
“`C
close(fd);
“`
通过上述步骤,我们可以轻松地实现串口通信。但是,由于串口技术的专业性,调试和优化过程可能会变得繁琐和昂贵。在此处,我们建议使用常见的串口调试工具,在Linux中有许多优秀的串口调试工具可用。
三、使用Debug工具
调试串口通信时,有几个重要的参数,包括波特率、数据位、停止位、校验位等。通过串口调试工具,可以更加直观地查看回应数据,调整参数等。
1. minicom
Minicom是一款开源的串口通信程序,可用于调试、监视和控制串口设备。它是一个命令行串口调试工具,提供了许多强大的功能,包括自动发送和断线重联等。
一、串行通讯与并行通讯
在通信和计算机科学中,串行通信(Serial Communication)是一个通用概念,泛指所有的串行的通信协议,如RS232、RS422、RS485、USB、I2C、SPI等。
串行通讯是指仅用一根接收线和一根发送线就能将数据以位进行传输的一种通讯方式。尽管串行通讯的比按字节传输的并行通信慢,但是串口可以在仅仅使用两根线的情况下就能实现数据的传输。
二、串口通讯模式
串口通讯模式包括单工、半双工和全双工,其中单工模式数据传输只支持数据在一个方向上传输。半双工模式允许数据在两个方向上传输,但某一时刻只允许数据在一个方向上传输,实际上是一种切换方向的单工通信,不需要独立的接收端和发送端,两者可合并为一个端口。详见下图:
三、串口通讯协议
最初数据是模拟信号输出简单过程量,后来仪表接口出现了RS232接口,这种接口可以实现点对点的通信方式,但这种方式不能实现联网功能,这就促生了RS422和RS485。
我们知道串口通信的数据传输都是0和1,在单总线、I2C、UART中都是通过一根线的高低电平来判断逻辑1或者逻辑0,但这种信号线的GND再与其他设备形成共地模式的通信,这种共地模式传输容易产生干扰,并且抗干扰性能也比较弱。所以差分通信、支持多机通信、抗干扰强的RS422和RS485就被广泛的使用了。
RS422和RS485通信最大特点就是传输速度最大可以达到10Mb/s以上,最大传输距离超过1000米。大家需要注意的是虽然485最大速度和最大传输距离都很大,但是传输的速度是会随距离的增加而变慢的,所以两者是不可以兼得的。
四、RS232详细介绍
1.RS232的基本特性
RS-232是串行数据接口标准,是由电子工业协会(EIA: Electronic Industries Alliance)制订并发布的工业标准,以保证不同厂家产品之间的兼容。特性如下:
2.RS232的物理特性
在RS232的通讯方式中,两个通讯设备的"DB9接口"之间通过串口信号线建立起连接,串口信号线中使用"RS-232标准"传输数据信号。D型或D-subminiature(D形状超小型)连接器的原始编号系统使用D作为前缀(将其名称命名为系列),然后根据外壳尺寸选择A,B,C,D或E,末尾数字表示引脚数量。详见下图:
3.RS232的通信协议
RS232一般使用DB9接口,由于两个通讯设备之间的收发信号(RXD与TXD)应交叉相连,所以调制调解器端的DB9母头的收发信号接法一般与公头的相反。DB9公头、母头以及引脚说明详见下方图和表。
4.RS232的波特率
在信道中,携带数据信息的信号单元叫码元,单位时间内通过信道传输的码元数称为码元传输速率,简称波特率(Baud Rate),其单位是波特(Baud,symbol/s),波特率是传输通道频宽的指标。RS232典型的“波特率”是
300/1200/2400/9600/19200/38400/115200 /230400等。
表2 不同BAUD Rate对应的RS232通信距离
5.RS232的数据结构
一个完整的串行数据,也就是一个数据帧(Data frame),或者一个字符帧,包括起始位、数据位、停止位、奇偶校验位。数据位前后即帧头和帧尾,包含一些必要的控制信息。其中,MSB(Most Significant Bit)是指低地址存放最高有效字节,LSB(Least Significant Bit)则是低地址存放最低有效字节。
起始位:起始位必须是持续一个比特时间的逻辑0电平,标志传输一个字符的开始,接收方可用起始位使自己的接收时钟与发送方的数据同步。
数据位:数据位紧跟在起始位之后,是通信中的真正有效信息。数据位的位数可以由通信双方共同约定。传输数据时先传送字符的低位,后传送字符的高位。
奇偶校验位:奇偶校验位仅占一位,用于进行奇校验或偶校验,奇偶检验位不是必须有的。如果是奇校验,需要保证传输的数据总共有奇数个逻辑高位;如果是偶校验,需要保证传输的数据总共有偶数个逻辑高位。
停止位:停止位可以是是1位、1.5位或2位,可以由软件设定。它一定是逻辑1电平,标志着传输一个字符的结束。
空闲位:空闲位是指从一个字符的停止位结束到下一个字符的起始位开始,表示线路处于空闲状态,必须由高电平来填充。
6.RS232与RS232(TTL)
RS-232电平标准的信号不能直接被控制器直接识别,所以这些信号会经过一个"电平转换芯片"转换成控制器能识别的"TTL校准"的电平信号,才能实现通讯。
TTL全名是晶体管-晶体管逻辑集成电(Transistor-Transistor Logic),这种串行通信,对应的物理电平,始终是在0V和Vcc之间,其中常见的Vcc是5V或3.3V。TTL 高电平1是>=2.4V,低电平0是<=0.5V(对于5V或3.3V电源电压),这里是正逻辑。
RS-232电平标准的信号不能直接被控制器直接识别,所以这些信号会经过一个"电平转换芯片"转换成控制器能识别的"TTL"的电平信号,才能实现通讯。