Linux 串口编程笔记
以下是基于 AT91sam9260 的 linux 下的串口编程笔记,方便以后参考,也给其他正在做串
口的朋友一个参考。如有不恰当的地方请高手指正。
先说明以下开发环境,9260 有 6 个串口,使用了其中四个,其中两个用于 RS485 另外
两 个 用 于 RS232 。 因为 RS485 是半双 工 , 实 现 方 法 是 在 9260 的 串 口 上 连 接 了 一 个
MAX3485,使用串口的 RTS 作为对 MAX3485 的状态控制(RTS 低,MAX3485 接收器使
能,RST 高,MAX3485 驱动器使能)。
一、 串口初始化
确保 linux 系统初始化了你所需要的串口,我用的 AT91sam9260 的串口初始化在/arch/
arm/mach-at91/board-sam9260ek.c 中。
找 到 ek_map_io(void) 函 数 , 在 这 个 函 数 中 增 加 自 己 的 串 口 初 始 化 , 其 中 的
at91_register_uart()便是你需要调用的函数。
例:
at91_register_uart(AT91SAM9260_ID_US0,1,ATMEL_UART_RTS);
以上这个函数的调用就是将 9260 的 UART0 口初始化对应到/dev/ttyS1,并使他的 RTS 可
用。
AT91SAM9260_ID_US0 :代表了 9260 的 UART0
1 :代表/dev/ttyS1
ATMEL_UART_RTS:允许在应用层控制 RTS0 引脚;否则应用层对 RTS0 的控制无效。
(前面说过,RS485 口是用的 RTS 做的控制)
二、 /dev/ttySn 节点是否都在
串口初始化完成后,就要判断/dev/ttySn 是否都存在,开始我就是注册了 4 个串口,结
构/dev 下只有三个 ttyS。其实很简单,可以手动使用 mknod 命令添加串口节点。或者
在做根文件系统时记得添加上。
三、 编写 linux 串口读写应用
关于串口应用的编写,网上有很多例子,就不详细说明了,我也比较菜也说不太明白,
我就是只说一下我用到的,网上不太多见的。
(1) 关于 RTS 引脚的控制,如果在应用中控制某个串口的 RTS 引脚输出高低电平,
从而控制 MAX3485 呢?
这一部分就直接借用网上的资料了。
其实在 linux 下对串口的设置主要是通过 termios 这个结构体实现的,但是这个结构体
却没有提供控制 RTS 或获得 CTS 等串口引脚状态的接口,可以通过 ioctl 系统调用来
获得/控制。
获得:
ioctl(fd, TIOCMGET, &controlbits);
if (controlbits & TIOCM_CTS)
printf(“有信号/n”);