Linux下串口通信详解(上)打开串口和串口初始化详解

AI助手已提取文章相关产品:

linux下串口通信主要有下面几个步骤

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 的值

您可能感兴趣的与本文相关内容

评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值