linux下串口通信主要有下面几个步骤
串口通信流程图
下面我会一一介绍这几个步骤。
1.打开串口
代码(串口为ttyUSB0)
//打开串口
int open_port(void)
{
int fd;
fd=open("/dev/ttyUSB0",O_RDWR | O_NOCTTY | O_NONBLOCK);//O_NONBLOCK设置为非阻塞模式,在read时不会阻塞住,在读的时候将read放在while循环中,下一节篇文档将详细讲解阻塞和非阻塞
// printf("fd=%d\n",fd);
if(fd==-1)
{
perror("Can't Open SerialPort");
}
return fd;
}
打开串口时也可以多加一些内容,比如判断串口为阻塞状态、测试是否为终端设备等,这些是必要的,所以较上面的基本的打开串口的代码,更加完整健壮一些的代码流程如下所示:
打开串口较完整流程图
代码:
/**
* open port
* @param fd
* @param comport 想要打开的串口号
* @return 返回-1为打开失败
*/
int open_port(int fd,int comport)
{
char *dev[]={"/dev/ttyUSB0","/dev/ttyS1","/dev/ttyS2"};
if (comport==1)//串口1
{
fd = open( "/dev/ttyUSB0", O_RDWR|O_NOCTTY|O_NDELAY);
if (-1 == fd)
{
perror("Can't Open Serial Port");
return(-1);
}
}
else if(comport==2)//串口2
{
fd = open( "/dev/ttyS1", O_RDWR|O_NOCTTY|O_NDELAY); //没有设置<span style="font-family: Arial, Helvetica, sans-serif;">O_NONBLOCK非阻塞模式,也可以设置为非阻塞模式,两个模式在下一篇博客中具体说明</span>
if (-1 == fd)
{
perror("Can't Open Serial Port");
return(-1);
}
}
else if (comport==3)//串口3
{
fd = open( "/dev/ttyS2", O_RDWR|O_NOCTTY|O_NDELAY);
if (-1 == fd)
{
perror("Can't Open Serial Port");
return(-1);
}
}
/*恢复串口为阻塞状态*/
if(fcntl(fd, F_SETFL, 0)<0)
printf("fcntl failed!\n");
else
printf("fcntl=%d\n",fcntl(fd, F_SETFL,0));
/*测试是否为终端设备*/
if(isatty(STDIN_FILENO)==0)
printf("standard input is not a terminal device\n");
else
printf("isatty success!\n");
printf("fd-open=%d\n",fd);
return fd;
}
关键函数解释:
open
功能描述:用于打开或创建文件,成功则返回文件描述符,否则返回-1,open返回的文件描述符一定是最小的未被使用的描述符
#include<fcntl.h>
int open(const char *pathname, int oflag, ... );参数解释:
pathname:文件路径名,串口在Linux中被看做是一个文件
oflag:一些文件模式选择,有如下几个参数可以设置
- O_RDONLY只读模式
- O_WRONLY只写模式
- O_RDWR读写模式
- O_APPEND每次写操作都写入文件的末尾
- O_CREAT如果指定文件不存在,则创建这个文件
- O_EXCL如果要创建的文件已存在,则返回 -1,并且修改 errno 的值

打开串口和串口初始化详解&spm=1001.2101.3001.5002&articleId=50707965&d=1&t=3&u=21d69e42367649f58785567fd9954f7e)
3830
打开串口和串口初始化详解&spm=1001.2101.3001.11663&articleId=50707965&d=1&t=3&u=38c6c174afc14b5a8764ed33cc966611)

被折叠的 条评论
为什么被折叠?



