美文网首页
Linux串口详解

Linux串口详解

作者: 炎鸿 | 来源:发表于2021-08-21 23:52 被阅读0次

1 串口的操作

#include <termios.h>

1.1打开:

fd = open("/dev/ttySAC1", O_RDWR | O_NOCTTY | O_NDELAY);
O_RDWR: 读写方式打开;
O_NOCTTY: 不允许进程管理串口;
O_NDELAY: 非阻塞(默认为阻塞,打开后也可以使用fcntl()重新设置)

1.2写入:

n = write(fd, "linux", 5);
n实际写入字节数;

1.3读取:

n = read(fd,buf,len);
n读取的字节数

1.4设置:

fcntl(fd, F_SETFL, FNDELAY); //非阻塞
fcntl(fd, F_SETFL, 0); // 阻塞

1.5关闭:

close(fd);

2、串口配置

struct termios options;  // 串口配置结构体
tcgetattr(fd,&options); //获取当前设置
bzero(&options,sizeof(options));

options.c_cflag  |= B115200 | CLOCAL | CREAD; // 设置波特率,本地连接,接收使能

options.c_cflag &= ~CSIZE; //屏蔽数据位

options.c_cflag  |= CS8; // 数据位为 8 ,CS7 for 7 

options.c_cflag &= ~CSTOPB; // 一位停止位, 两位停止为 |= CSTOPB

options.c_cflag &= ~PARENB; // 无校验
 //options.c_cflag |= PARENB; //有校验
//options.c_cflag &= ~PARODD // 偶校验
//options.c_cflag |=  PARODD    // 奇校验

options.c_cc[VTIME] = 0; // 等待时间,单位百毫秒 (读)。后有详细说明
options.c_cc[VMIN] = 0; // 最小字节数 (读)。后有详细说明

tcflush(fd, TCIOFLUSH); 
// TCIFLUSH: 刷清输入队列。
// TCOFLUSH: 刷清输出队列。 
// TCIOFLUSH: 刷清输入、输出队列。

tcsetattr(fd, TCSANOW, &options); 
// TCSANOW立即生效;
// TCSADRAIN:Wait until everything has been transmitted;
// TCSAFLUSH:Flush input and output buffers and make the change

3、VTIME 和 VMIN

VTIME 定义要求等待的零到几百毫秒的值(通常是一个8位的unsigned char变量)。
VMIN 定义了要求等待的最小字节数, 这个字节数可能是0。
只有设置为阻塞时这两个参数才有效,仅针对于读操作。
说起来比较复杂,举个例子吧,设置为阻塞状态,写操作未进行实验,这里仅讨论读操作,
read(fd,&buf,8); // 读串口

3.1

options.c_cc[VTIME] = 0;
options.c_cc[VMIN] = 0;
VMIN = 0,当缓冲区字节数 >= 0 时进行读操作,实际上这时读串口操作并未被阻塞,因为条件始终被满足。

3.2

options.c_cc[VTIME] = 0;
options.c_cc[VMIN] = 1;
VMIN = 1,当缓冲区字节数 >= 1 时进行读操作,当没有数据时读串口操作被阻塞。

3.3

options.c_cc[VTIME] = 0;

options.c_cc[VMIN] = 4;
VMIN = 4,当缓冲区字节数 >= 4 时进行读操作,否则读串口操作被阻塞。每次读出的最大字节数由read函数中第三个参数决定。直到缓冲区剩下的数据< read 第三个参数 并且< 4 (如果这时read第三参数为 1 则进行4次读操作直至读完缓冲区,如read第三参数为2,连续进行读操作,直至缓冲区空或还剩一个字符)。没有设置VTIME,剩下的字符没有确定的期限,直到下次满足读条件的时候才被读出。

3.4

考虑VTIME时
options.c_cc[VTIME] = 10; //单位百毫秒
options.c_cc[VMIN] = 4;
3.3的区别就是,没满足条件或读缓冲区中剩下的数据会在1秒(10百毫秒)后读出
特别注意的是: 当设置VTIME后,如果read第三个参数小于VMIN ,将会将VMIN 修改为read的第三个参数,即使用read(fd,&buf,2);,以上设置变为:
options.c_cc[VTIME] = 10;
options.c_cc[VMIN] = 2;

相关文章

  • Linux串口详解

    1 串口的操作 #include 1.1打开: fd = open("/dev/ttySA...

  • Linux

    linux awk命令详解、linux awk命令Linux常用操作指令Linux netstat命令详解 awk...

  • 2018-10-09 Mac的Terminal窗口之TTY

    PC上的串口一般是ttyS,板子上Linux的串口一般叫做ttySAC,是usb口转串口的是ttyUSB,外插串口...

  • 3月5日的面试题.md

    [TOC] 驱动模块类 串口驱动 Linux把每个串行端口都看做是一个字符设备串口初始化 、打开串口、串口写操作、...

  • 2019-11-02 Linux下USB-串口的使用

    在实验室配置一台设备要用到串口,但串口线只连到了linux服务器上,又不想跑一趟实验室,就直接用linux串口连吧...

  • Lniux的top命令

    Linux top命令详解 地址:Linux top命令的用法详细详解_南有南无-CSDN博客_linux top...

  • Linux系统目录规范详解

    Linux目录详解 Linux目录详解(RHEL5.4) 由于linux是开放源代码,各大公司和团体根据linux...

  • linux uart应用程序

    linux uart应用程序 1确定原理图中需要使用的串口是串口三 2查找驱动节点 3编写应用程序,串口接收到什么...

  • Linux 文件权限

    Linux chmod命令详解linux 文件属性与权限

  • linux free命令详解(一)

    linux free命令详解(一)

网友评论

      本文标题:Linux串口详解

      本文链接:https://www.haomeiwen.com/subject/fokkiltx.html