linux串口通讯要点

=========================================================================================================
一. 应用层打开串口方法。
1、首先是操作串口需要包含的头文件:
#include <stdio.h>   /*标准输入输出的定义*/
#include <errno.h>  /*错误号定义*/
#include <sys/stat.h>
#include <fcntl.h>  /*文件控制定义*/
#include <termios.h>    /*PPSIX 终端控制定义*/
#include <stdlib.h> /*标准函数库定义*/
#include <sys/types.h>
#include <unistd.h> /*UNIX 标准函数定义*/


2、串口相关操作 
打开串口: 
我们都知道,在Linux下,除了网络设备,其余的都是文件的形式。串口设备也一样在/dev下。 
所以我们可以通过open系统调用/函数来访问它。 
示例:fd = open("/dev/ttyUSB0",O_RDWR|O_NOCTTY|O_NDELAY); 
O_NOCTTY:可以告诉Linux这个程序不会成为这个端口上的“控制终端”.如果不这样做的话,所有的输入,比如键盘上过来的Ctrl+C中止信号等等,会影响到你的进程。 
O_NDELAY:标志则是告诉Linux,这个程序并不关心DCD信号线的状态——也就是不关心端口另一端是否已经连接。


读写串口: 
与普通文件一样,使用read,write函数。 
示例:read(fd,buff,8); 
write(fd,buff,8);




==========================================================================================================
二、串口属性设置:
 
最基本的设置串口包括波特率设置,效验位和停止位设置。这由通信双方协定。
很多系统都支持POSIX终端(串口)接口.程序可以利用这个接口来改变终端的参数,比如,波特率,字符大小等等.要使用这个端口的话,你必须将<termios.h>头文件包含到你的程序中。这个头文件中定义了终端控制结构体和POSIX控制函数。


最重要的就是这个结构体:


struct termios
 {
 tcflag_t  c_iflag;  //输入选项
 tcflag_t  c_oflag;  //输出选项
 tcflag_t  c_cflag;  //控制选项
 tcflag_t  c_lflag;  //行选项
 cc_t      c_cc[NCCS]; //控制字符
 }; 


其中我们更关注的是c_cflag控制选项。其中包含了波特率、数据位、校验位、停止位的设置。 
它可以支持很多常量名称其中设置数据传输率为相应的数据传输率前要加上“B”。 
c_cflag成员不能直接对其初始化,而要将其通过与、或操作使用其中的某些选项。 
设置串口属性主要是配置termios结构体中的各个变量,大致流程如下:


1.使用函数tcgetattr保存原串口属性 
struct termios newtio,oldtio; 
tcgetattr(fd,&oldtio);


2.通过位掩码的方式激活本地连接和接受使能选项:CLOCAL和CREAD 
newtio.c_cflag | = CLOCAL | CREAD;


3.使用函数cfsetispeed和cfsetospeed设置数据传输率 
cfsetispeed(&newtio,B115200); 
cfsetospeed(&newtio,B115200);


4.通过位掩码设置字符大小。 
newtio.c_cflag &= ~CSIZE; 
newtio.c_cflag |= CS8;


5.设置奇偶效验位需要用到两个termios中的成员:c_cflag和c_iflag。
首先要激活c_cflag中的校验位使能标志PARENB和是否进行奇偶效验,同时还要激活c_iflag中的奇偶效验使能。 
设置奇校验: 
newtio.c_cflag |= PARENB; 
newtio.c_cflag |= PARODD; 
newtio.c_iflag |= (INPCK | ISTRIP); 
设置偶校验: 
newtio.c_iflag |= (INPCK|ISTRIP); 
newtio.c_cflag |= PARENB; 
newtio.c_cflag |= ~PARODD;


6.激活c_cflag中的CSTOPB设置停止位。
若停止位为1,则清除CSTOPB;若停止位为0,则激活CSTOPB。 
newtio.c_cflag &= ~CSTOPB;


7.设置最少字符和等待时间。在对接收字符和等待时间没有特别要求的情况下,可以将其设置为0。 
newtio.c_cc[VTIME] = 0; 
newtio.c_cc[VMIN] = 0;


8.调用函数”tcflush(fd,queue_selector)”来处理要写入引用的对象,queue_selector可能的取值有以下几种。 
TCIFLUSH:刷新收到的数据但是不读 
TCOFLUSH:刷新写入的数据但是不传送 
TCIOFLUSH:同时刷新收到的数据但是不读,并且刷新写入的数据但是不传送。 
9.激活配置。在完成配置后,需要激活配置使其生效。使用tcsetattr()函数。 
int tcsetattr(int filedes,int opt,const struct termios *termptr);



==========================================================================================================
三、linux下串口能被同时多次打开吗? (windows是独占的,只可打开一次)


答:可以!!!!! 可以!!!!! 可以!!!!! 而且获得到的fd是一个!!!!
一般情况下设备只可被打开一次,而且多次打开同一文件时会获得不同fd。
但是此处多次打开且获得同样fd,猜测后续的打开是假象,直接从系统获取的fd。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值