Rockchip UART (Universal Asynchronous Receiver/Transmitter) 基于16550A串口标准。内核里面使用8250串口通用驱动,因此能够支持Linux下的标准串口编程。
板上引出三组通用串口,还有一路调试串口,建议不要把调试串口用于其他用途。
这三组通用串口的序号分别是5、7、9,在Linux下对应的设备节点分别是/dev/ttyS5 /dev/ttyS7 /dev/ttyS9.下面以ttyS9为例介绍其用法,其他几路串口也是类似的。
下面通过在硬件上短接ttyS9的TX 和RX,来进行收发测试,接线如下
"/dev/ttyS*"的节点都需要root权限才能操作,使用命令行或者C语言编译出来的程序操作串口都需要root权限。如果是ssh或者使用LX终端的,先执行如下命令获取root权限。
sudo su
查看串口信息
stty -F /dev/ttyS9
设置串口波特率为115200
stty -F /dev/ttyS9 speed 115200
设置串口八位数据位 无校验 一位停止位 无回显
stty -F /dev/ttyS9 cs8 -parenb -cstopb -echo
将串口的TXRX短接,然后进行收发测试
后台接收数据,前台执行发送
cat /dev/ttyS9 &
echo -e "12345\n" > /dev/ttyS9
执行结果如下,可以看到接收到的数据即为发送的
通过连接 libperipheral_api.a 静态库,可以使用C语言调用以下接口来操作串口
/**
* @name: user_uart_open
* @description: 打开串口
* @param uart_num: 串口号,板上引出的串口包括3 4 8 9
* @return 大于等于0 - 成功,返回值为文件描述符 小于0 - 失败
*/
int user_uart_open(int uart_num);
/**
* @name: user_uart_set_property
* @description: 设置波特率 位数 停止位 校验位
* @param fd: 文件描述符,user_uart_open返回值
* @param speed: 波特率,目前支持 921600, 460800, 230400, 115200, 57600, 38400, 19200, 9600, 4800, 2400, 1200, 300
* @param databits: 长度,目前支持7 8位数据位
* @param stopbits: 停止位,目前支持1 2位停止位
* @param parity: 校验,n不校验,o奇校验,e偶校验
*
* @return 等于0 - 成功 小于0 - 失败
*/
int user_uart_set_property(int fd, int speed, int databits, int stopbits, int parity);
/**
* @name: user_uart_read
* @description: 从串口缓冲读取数据
* @param fd: 文件描述符,user_uart_open返回值
* @param buf: 读入数据的指针
* @param buf_len: buf指向区域的长度
*
* @return 大于0 - 成功 小于0 - 失败 等于0 - 没有读到任何数据
*/
int user_uart_read(int fd, char *buf, unsigned int buf_len);
/**
* @name: user_uart_write
* @description: 向串口缓冲写入数据
* @param fd: 文件描述符,user_uart_open返回值
* @param buf: 读入数据的指针
* @param buf_len: buf指向区域的长度
*
* @return 大于0 - 成功 小于0 - 失败 等于0 - 没有数据被写入
*/
int user_uart_write(int fd, const char *buf, unsigned int buf_len);
/**
* @name: user_uart_close
* @description: 关闭串口
* @param fd: 文件描述符,user_uart_open返回值
* @return 大于等于0 - 成功,返回值为文件描述符 小于0 - 失败
*/
int user_uart_close(int fd);
测试demo如下,以操作 串口9为例,短接TX RX
#include "peripheral_api.h"
void uart_api_test(void)
{
int ret = 0;
int fd = -1;
unsigned char buf_write[5] = {0};
unsigned char buf_read[5] = {0};
for (unsigned char i = 0; i < sizeof(buf_write); i++) {
buf_write[i] = 0x32 + i;
}
fd = user_uart_open(9);
if (fd < 0) {
printf("user_uart_open fail \n");
return;
}
ret = user_uart_set_property(fd, 115200, 8, 1, 'n');
if (ret < 0) {
printf("user_uart_set_property fail \n");
return;
}
ret = user_uart_write(fd, buf_write, sizeof(buf_write));
if (ret <= 0) {
printf("user_uart_write fail \n");
user_uart_close(fd);
return;
}
fsync(fd);
usleep(200 * 1000);
ret = user_uart_read(fd, buf_read, sizeof(buf_read));
if (ret <= 0) {
printf("user_uart_read fail \n");
user_uart_close(fd);
return;
}
user_uart_close(fd);
if (memcmp(buf_write, buf_read, sizeof(buf_write)) == 0) {
printf("buf_write buf_read same\n");
} else {
printf("buf_write buf_read diff %d %d %d %d %d \n", buf_read[0], buf_read[1], buf_read[2], buf_read[3], buf_read[4]);
}
return;
}
int main()
{
uart_api_test();
return 0;
}
将peripheral_api.a静态库、peripheral_api.h和测试demo源码test.c放到同一路径下,编译命令如下
aarch64-none-linux-gnu-gcc test.c peripheral_api.a -I. -o uarttest
运行结果如下