中企动力建设网站怎么样,自己设计logo的软件,网页设计作业选材,重点建设专业 专题网站以前跟着做过VxWorks的开发#xff0c;主要通信方式是串口#xff0c;因为底层BSP包已经做好了#xff0c;串口通信非常简单。后来接触Linux#xff0c;在一块OK6410上跑Linux串口通信#xff0c;才发现原来天真的以为甚是简单的串口变得如此的不简单。#include termi…以前跟着做过VxWorks的开发主要通信方式是串口因为底层BSP包已经做好了串口通信非常简单。后来接触Linux在一块OK6410上跑Linux串口通信才发现原来天真的以为甚是简单的串口变得如此的不简单。#include termios.h1、串口的操作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读取res read(fd,buf,len); res 读取的字节数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; // 一位停止位 两位停止为 | CSTOPBoptions.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立即生效 TCSADRAINWait until everything has been transmitted TCSAFLUSHFlush input and output buffers and make the change3、VTIME 和 VMINVTIME 定义要求等待的零到几百毫秒的值(通常是一个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.2options.c_cc[VTIME] 0;options.c_cc[VMIN] 1;VMIN 1当缓冲区字节数 1 时进行读操作当没有数据时读串口操作被阻塞。3.3options.c_cc[VTIME] 0;options.c_cc[VMIN] 4;VMIN 4当缓冲区字节数 4 时进行读操作否则读串口操作被阻塞。每次读出的最大字节数由read函数中第三个参数决定。直到缓冲区剩下的数据 read 第三个参数 并且 4 如果这时read第三参数为 1 则进行4次读操作直至读完缓冲区如read第三参数为2连续进行读操作直至缓冲区空或还剩一个字符。没有设置VTIME剩下的字符没有确定的期限直到下次满足读条件的时候才被读出。----------------------------------考虑VTIME-----------------------------3.4options.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;