概述
首先在设备树下添加串口通信的子节点,这里我用的是串口三
&uart3 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_uart3>;
status = "okay";
};
然后将引脚复用成串口
pinctrl_uart3: uart3grp {
fsl,pins = <
MX6UL_PAD_UART3_RX_DATA__UART3_DCE_RX 0x1b0b1
MX6UL_PAD_UART3_TX_DATA__UART3_DCE_TX 0x1b0b1
>;
};
修改完设备树,编译复制过去就可以用了。
下面是测试uart通信
首先打开串口文件
#define DEV_NAME
"/dev/ttymxc2"
fd = open(DEV_NAME, O_RDWR|O_NOCTTY|O_NDELAY);
然后创建termios 结构体:
struct termios newtio,oldtio;
再将结构体清0
bzero(&newtio,sizeof(newtio));
这样就可以通过这个结构体去定义串口变量了
newtio.c_cflag |= CLOCAL|CREAD;
newtio.c_cflag &= ~CSIZE;
newtio.c_cflag |= CS8;
//8位数据位
newtio.c_cflag &= ~PARENB;
//无校验
newtio.c_cflag &= ~CSTOPB;
//1位停止位
cfsetispeed(&newtio,B115200);
cfsetospeed(&newtio,B115200);
//设置波特率115200
newtio.c_cc[VTIME] = 1;
//读取一个字符等待1/10s
newtio.c_cc[VMIN] = 1;
//读取字符的最少个数为1
tcflush(fd,TCIFLUSH);
//清空缓冲区
if(tcsetattr(fd,TCSANOW,&newtio)!= 0)
{
perror("setup uart3 error");
return -1;
}
printf("uart3 is setupn");
tcflush(fd,TCIOFLUSH);
//清空缓冲区
fcntl(fd,F_SETFL,0);
//串口阻塞
在监视发生通信时使用select函数监视
tcflush(fd,TCIOFLUSH);
//清空缓冲区
FD_ZERO(&fs_read);
FD_SET(fd,&fs_read);
//添加描述符
FD_ZERO(&fs_write);
FD_SET(fd,&fs_write);
//添加描述符
fs_sel = select(fd + 1 ,&fs_read,&fs_write,NULL,NULL);
len = 0;
//初始化标志
if(fs_sel)
{
len = read(fd,receive_buf,99);
if(len > 0)
{
receive_buf[len] = '