我是靠谱客的博主 有魅力小懒猪,最近开发中收集的这篇文章主要介绍Linux下串口通信测试,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

首先在设备树下添加串口通信的子节点,这里我用的是串口三

&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] = '';
printf("receive data is %s",receive_buf);
printf("
receive data length is %dn",len);
write(fd,send_data_buf,strlen(send_data_buf));
printf("send data is %s",send_data_buf);
printf("
send data length is %dn",strlen(send_data_buf));
len = 0;
}
}
else
{
return -1;
}
usleep(100000);
//休眠100ms

}

整个过程就是通过termios 结构体定义串口通信的基本信息比如波特率等后通过select函数去监视文件/dev/ttymxc2的读写。当触发时通过read函数读取内容,在打印出来。在将send_data_buf数组的内容通过write函数写到连接计算机的串口。
整个代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <error.h>
#include <getopt.h>
#include <strings.h>
#include <string.h>
#include <time.h>
#include <sys/select.h>
#define DEV_NAME
"/dev/ttymxc2"
int main(int argc,char *argv[])
{
struct termios newtio,oldtio;
int fd;
char receive_buf[100];
int len,fs_sel;
fd_set fs_read,fs_write;
static char send_data_buf[] ={"send data"};
fd = open(DEV_NAME, O_RDWR|O_NOCTTY|O_NDELAY);
if(fd < 0)
{
perror(DEV_NAME);
return -1;
}
printf("fd is %dn",fd);
if(tcgetattr(fd,&oldtio)!=0)
{
perror("save error");
return -1;
}
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);
//串口阻塞
while(1)
{
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] = '';
printf("receive data is %s",receive_buf);
printf("
receive data length is %dn",len);
write(fd,send_data_buf,strlen(send_data_buf));
printf("send data is %s",send_data_buf);
printf("
send data length is %dn",strlen(send_data_buf));
len = 0;
}
}
else
{
return -1;
}
usleep(100000);
//休眠100ms

}
printf("exit!n");
return 0;
}

结果就是当我们在通过uart发送数据给linux系统时,linux系统将数据打印,输出长度,再输入send_data_buf数组中的内容 send data。
串口演示

最后

以上就是有魅力小懒猪为你收集整理的Linux下串口通信测试的全部内容,希望文章能够帮你解决Linux下串口通信测试所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(65)

评论列表共有 0 条评论

立即
投稿
返回
顶部