By Toradex秦海
1). 简介
UART串口是嵌入式设备最为常用的调试和通讯接口之一,无论是RS232还是RS422/485都有着非常广泛的应用,因此本文就基于嵌入式Linux演示在User Space进行串口调试。
本文所演示的平台来自于Toradex Colibri iMX6DL ARM嵌入式平台,这是一个基于NXP iMX6DL ARM处理器,支持双核Cortex-A9。
2. 准备
a).Colibri iMX6DL ARM核心版配合Colibri Eva Board载板,连接调试串口UART1到开发主机方便调试,同时配置好Ubuntu开发主机开发环境,具体操作方法可以参考这里。
b).Colibri iMX6DL系统使用Toradex Linux Release V2.6.1,下载和更新方法请参考这里。
3). RS232串口通讯测试
a). Colibri iMX6S核心版默认定义提供了三个串口,如下所示,其中UART1为默认的调试串口,当然可以通过uboot设置关闭调试串口或者指定另外一个串口作为调试串口。
b). Colibri Eva Board X25 Top DB9连接器默认为UART2接口,连接到Ubuntu开发主机进行UART2串口测试。另外,通过载板跳线测试也可以将UART3串口路由到X25 bottom DB9连接器上面,具体说明可以参考这里。
c). User Space下直接操作UART2串口设备进行测试
---------------------------------
//设置串口bandrate
root@colibri-imx6# stty -F /dev/ttymxc1 115200
//发送数据
root@colibri-imx6# echo Test > /dev/ttymxc1
//接收数据
root@colibri-imx6# cat /dev/ttymxc1
--------------------------------
d). User Space下通过C程序测试UART2串口
./ uart相关基本操作头文件和子程序
//打开和关闭uart设备
uart_open
uart_close
//配置uart baudrate以及其他参数并生效
uart_config
//利用write函数发送数据
uart_send
//利用select函数侦测事件发生,然后用read函数读取数据
uart_read
具体代码请见这里:
uartconfig.h - https://github.com/simonqin09/uarttest/blob/master/uartconfig.h
uartconfig.c - https://github.com/simonqin09/uarttest/blob/master/uartconfig.c
./ main主程序,打开并配置串口baud rate 115200,发送数据然后接收数据来测试串口。
具体代码如下:
https://github.com/simonqin09/uarttest/blob/master/uarttest.c
./执行情况,可见收发都正常
--------------------------------
//Colibri iMX6调试串口输出
root@colibri-imx6:~# ./uarttest /dev/ttymxc1
send successflly
send sucessfully
test!
//PC主机RS-232接口测试端口输出,收到message后,键盘键入”test!”后回车。
Welcome to minicom 2.7
……
this is a test program
--------------------------------
4). RS485串口通讯测试
a). Colibri iMX6 UART除了RS232模式,也支持RS422/485模式,这里还是利用UART2来测试RS485半双工模式通讯,基于Colibri Eva Board的硬件连接如下:
./ 将Colibri Eva Board连接器X2 bottom DB9 管脚4(RXD+),管脚5(RXD-)以及管脚1(GND)和PC主机485接口设备对接
./ 将Colibri Eva Board下面几个跳线做如下设置:
JP11 短接 – 让485接口可以发送以及接收收据,如果断开,则只能发送数据
JP12,JP14断开 – 用于插入120ohm终端电阻,针对RS-422模式
JP13,JP15短接 – 设置为半双工模式,如果断开,则为全双工模式
JP16短接 – UART2到RS232的功能关闭,切换到RS485功能;断开则反之。
b). 然后需要使能UART2 RS485功能,有两种方式,一种是在device tree中使能,另外一种是利用ioctrl TIOCSRS485在User Space中使能。
./ 在device tree中使能
//参考这里下载Toradex Linux kernel V2.6版本源代码,根据如下patch文件修改arch/arm/boot/dts/imx6dl-colibri-eval-v3.dts文件,并参考这里编译新的dtb文件后部署到Colibri iMX6模块上。
https://github.com/simonqin09/uarttest/blob/master/485.patch
然后可以和上面第三章节完全一样的两种方式操作UART2设备进行测试通信,无需任何改动。
./ 利用ioctrl TIOCSRS485 在C程序中使能并通信
//在上面uartconfig.h和uartconfig.c文件中添加485使能函数,同时可以配置RTS在发送中和发送后的电平以及时间延迟设置。
uart_485
//在uarttest.c中添加下面485使能,其他和上面RS232都一致。
--------------------------------
if(uart_485(fd) < 0)
{
printf("failed enable RS485 mode\n");
return -1;
}
else
printf("RS485 mode enabled\n");
--------------------------------
完整代码同样可以参考上面第3章节里面的这三个文件链接
//程序部署后执行情况,可见收发都正常
--------------------------------
//Colibri iMX6调试串口输出
root@colibri-imx6:~# ./uarttest /dev/ttymxc1
RS485 mode enabled
send successflly
send sucessfully
test!
//PC主机RS485接口测试端口输出,收到message后,键盘键入”test!”后回车。
Welcome to minicom 2.7
……
this is a test program
--------------------------------
5). 总结
本文基于NXP iMX6嵌入式平台在嵌入式linux系统下测试了UART相关通信,希望给大家有所帮助。