硬件设备:正点原子的IMX6U-ALPHA开发板;薄膜压力传感器。
第一部分:添加设备树
首先:因为 I.MX6U 的 UART 驱动 NXP 已经编写好了,我们只需在设备树中添加 UART3 对应的设备节点即可。
/*在iomuxc中增加pinctrl节点,并保证两引脚没有被其他功能所占用*/
&iomuxc {
……
pinctrl_uart3:uart3grp{
fsl,pins = <
MX6UL_PAD_UART3_TX_DATA__UART3_DCE_TX 0x1b0b1
MX6UL_PAD_UART3_RX_DATA__UART3_DCE_RX 0x1b0b1
>;
/*添加UART3对应的uart3节点*/
&uart3 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_uart3>;
status = "okay";
};
此时,重新编译设备树启动Linux,会生成 “/dev/ttymxc2” 的设备文件,这就是 UART3 对应的设备文件,通过访问 ttymxc2 来实现 UART3 的操作。
可以移植 minicom 作为串口调试工具,验证串口的功能,此处省略。
第二部分:Linux下C语言程序,用于驱动 UART3 实现我们想要的功能
本程序的主要目的,是驱动 UART3 与薄膜压力传感器进行通信,薄膜压力传感器说明书上已经定义,使用串口,以ASCII码发送“READ P”用于读取压力值,因此,我们需要驱动串口,发送此命令,并对收到的命令进行解析,返回想要的压力值。
程序分为两部分:一部分实现串口的初始化,包括设置串口的波特率、数据位、校验位、停止位;第二部分驱动串口发送命令,解析命令。
在串口驱动中,需要用到一个重要的结构体 “termios” ,定义在 “termios.h” 中,如下:
struct termios
{
tcflag_t c_iflag; /* input mode flags 输入模式标志位*/
tcflag_t c_oflag; /* output mode flags 输出模式标志位*/
tcflag_t c_cflag; /* control mode flags 控制模式标志位*/
tcflag_t c_lflag; /* local mode flags 本地模式标志位*/
cc_t c_line; /* line discipline */
cc_t c_cc[NCCS]; /* control characters */
speed_t c_ispeed; /* input speed */
speed_t c_ospeed; /* output speed */
#define _HAVE_STRUCT_TERMIOS_C_ISPEED 1
#define _HAVE_