《串口操作函数.docx》由会员分享,可在线阅读,更多相关《串口操作函数.docx(7页珍藏版)》请在三一办公上搜索。
1、串口操作函数好文档不在多,而在精,这是本人多年精心挑选整理的文档,质量绝对上乘,欢迎大家下载阅读!即便如此,疏落、错误再所难免,希望大家批评指正,共同交流学习,相互提高,共同进步!串口操作函数1.打开串口:fd = open(/dev/ttyf1, O_RDWR | O_NOCTTY | O_NDELAY);fcntl(fd, F_SETFL, 0);O_NOCTTY 选项防止程序受键盘控制中止操作键等影响.O_NDELAY 告诉UNIX不必另一端端口是否启用.(检测DCD信号线状态)2.往串口发送数据n = write(fd, ATZr, 4);3.从串口读取数据当以原始数据模式(raw d
2、ata mode)打开串口时,read系统调用将不管串口输入缓存里有多少字符可读都返回.若没有数据,则阻塞直至有字符到来,或定时器超时.串口设置这个选项后,read调用都是立即返回.没有数据可读时,read返回0fcntl(fd, F_SETFL, FNDELAY);解除这个功能是fcntl(fd, F_SETFL, 0);4.关闭串口close(fd);二.标准的POSIX配置串口参数串口收发数据主要是要做好端口配置工作,需要包含<termios.h>,定义终端控制结构以及POSIX控制函数termios结构Table 3 - Termios Structure MembersMem
3、berDescriptionc_cflagControl optionsc_lflagLine optionsc_iflagInput optionsc_oflagOutput optionsc_ccControl charactersc_ispeedInput baud (new interface)c_ospeedOutput baud (new interface)串口异步传输各位bit表示方式struct termios termios_old,termios_new;1) 获取串口属性tcgetattr(fdcom, &termios_old); 2) 配置输入速率cfsetispe
4、ed(&termios_new, baudrate);cfsetospeed(&termios_new, baudrate);3) 控制模式,保证程序不会成为端口的占有者termios_new.c_cflag |= CLOCAL;控制模式,使能端口读取输入的数据termios_new.c_cflag |= CREAD;4) 控制模式,屏蔽字符大小位,设置串口传输数据所用的位数termios_new.c_cflag &= CSIZE;termios_new.c_cflag |= CS5; /CS6,CS7,CS85) 奇偶校验 parity check/无奇偶校验termios_new.c_cf
5、lag &= PARENB ; /偶校验termios_new.c_cflag |= PARENB;termios_new.c_cflag &= PARODD;/奇校验termios_new.c_cflag |= PARENB;termios_new.c_cflag |= PARODD;6) 设置停止位termios_new.c_cflag |= CSTOPB; /2stop bitstermios_new.c_cflag &= CSTOPB;/1 stop bits.7) 其他属性配置termios_new.c_oflag &= OPOST; /输出模式,原始数据输出termios_new.
6、c_ccVMIN = 1; /控制字符,所要读取字符的最小数量termios_new.c_ccVTIME = 1;/控制字符,读取第一个字符的等待时间,以0.1妙为单位8) 设置新属性tcsetattr(fdcom, TCSANOW, &termios_new);/ TCSANOW: 所由改变立即生效/TCSADRAIN: 等待所有东西都被发送出去后设置/TCSAFLUSH: 将输入输出buffer全部溢出后设置采用select系统调用读取串口数据跟其他socket,设备数据示例:假定我们要从一个串口和一个socket读取数据.需要判断每个文件描述符的输入数据情况,但10妙内无数据的话,需要通
7、知用户没有数据可读./* Initialize the input set */FD_ZERO(input);FD_SET(fd, input);FD_SET(socket, input);max_fd = (socket > fd ? socket : fd) + 1;/* Initialize the timeout structure */timeout.tv_sec = 10;timeout.tv_usec = 0;/* Do the select */n = select(max_fd, NULL, NULL, ;/* See if there was an error */if
8、 (n 0)perror(select failed);else if (n = 0)puts(TIMEOUT);else/* We have input */if (FD_ISSET(fd, input)process_fd;if (FD_ISSET(socket, input)process_socket;三.unix/linux下,采用ioctl函数来实现串口配置功能int ioctl(int fd, int request, .);fd是串口描述符,request参数是定义在<termios.h>的常量,一般是下表中的一个Table 10 - IOCTL Requests fo
9、r Serial PortsRequestDescriptionPOSIX FunctionTCGETSGets the current serial port settings.tcgetattrTCSETSSets the serial port settings immediately.tcsetattr(fd, TCSANOW, &options)TCSETSFSets the serial port settings after flushing the input and output buffers.tcsetattr(fd, TCSAFLUSH, &options)TCSETS
10、WSets the serial port settings after allowing the input and output buffers to drain/empty.tcsetattr(fd, TCSADRAIN, &options)TCSBRKSends a break for the given time.tcsendbreak, tcdrainTCXONCControls software flow control.tcflowTCFLSHFlushes the input and/or output queue.tcflushTIOCMGETReturns the sta
11、te of the MODEM bits.NoneTIOCMSETSets the state of the MODEM bits.NoneFIONREADReturns the number of bytes in the input buffer.None 为获取状态位,调用ioctl函数,用一个整数来存放位指针.Listing 5 - Getting the MODEM status bits.#include <unistd.h>#include <termios.h>int fd;int status;好文档不在多,而在精,这是本人多年精心挑选整理的文档,质量绝对上乘
12、,欢迎大家下载阅读!即便如此,疏落、错误再所难免,希望大家批评指正,共同交流学习,相互提高,共同进步!ioctl(fd, TIOCMGET, &status);Listing 6 - Dropping DTR with the TIOCMSET ioctl. #include <unistd.h>#include <termios.h>int fd;int status;ioctl(fd, TIOCMGET, &status);status &= TIOCM_DTR;ioctl(fd, TIOCMSET, status);好文档不在多,而在精,这是本人多年精心挑选整理的文档,质量绝对上乘,欢迎大家下载阅读!即便如此,疏落、错误再所难免,希望大家批评指正,共同交流学习,相互提高,共同进步!