串口操作函数
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
只有经过长时间完成其发展的艰苦工作,并长期埋头沉浸于其中的任务,方可望有所成就。——黑格尔
串口操作函数
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, "ATZ\r", 4);
3.从串口读取数据
当以原始数据模式(raw data mode)打开串口时,read系统调用将不管串口输入缓存里有多少字符可读都返回.若没有数据,则阻塞直至有字符到来,或定时器超时.
串口设置这个选项后,read调用都是立即返回.没有数据可读时,read返回0
fcntl(fd, F_SETFL, FNDELAY);
解除这个功能是
fcntl(fd, F_SETFL, 0);
4.关闭串口
close(fd);
二.标准的POSIX配置串口参数
串口收发数据主要是要做好端口配置工作,需要包含
termios结构
Table 3 - Termios Structure Members
Member
Description
c_cflag
Control options
c_lflag
Line options
c_iflag
Input options
c_oflag
Output options
c_cc
Control characters
c_ispeed
Input baud (new interface)
c_ospeed
Output baud (new interface)
串口异步传输各位bit表示方式
struct termios termios_old,termios_new;
1) 获取串口属性
tcgetattr(fdcom, &termios_old);
2) 配置输入速率
cfsetispeed(&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,CS8
5) 奇偶校验 parity check
//无奇偶校验
termios_new.c_cflag &= ~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 bits
termios_new.c_cflag &= ~CSTOPB; //1 stop bits.
7) 其他属性配置
termios_new.c_oflag &= ~OPOST; //输出模式,原始数据输出
termios_new.c_cc[VMIN] = 1; //控制字符,所要读取字符的最小数量
termios_new.c_cc[VTIME] = 1;//控制字符,读取第一个字符的等待时间,以0.1妙为单位
8) 设置新属性
tcsetattr(fdcom, TCSANOW, &termios_new);
// TCSANOW: 所由改变立即生效
//TCSADRAIN: 等待所有东西都被发送出去后设置
//TCSAFLUSH: 将输入输出buffer全部溢出后设置
采用select系统调用读取串口数据跟其他socket,设备数据
示例:
假定我们要从一个串口和一个socket读取数据.需要判断每个文件描述
符的输入数据情况,但10妙内无数据的话,需要通知用户没有数据可读.
/* 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 */
_sec = 10;
_usec = 0;
/* Do the select */
n = select(max_fd, NULL, NULL, ;
/* See if there was an error */
if (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参数是定义在
Table 10 - IOCTL Requests for Serial Ports
Request
Description
POSIX Function
TCGETS
Gets the current serial port settings.
tcgetattr
TCSETS
Sets the serial port settings immediately.
tcsetattr(fd, TCSANOW, &options)
TCSETSF
Sets the serial port settings after flushing the input and output buffers.
tcsetattr(fd, TCSAFLUSH, &options)
TCSETSW
Sets the serial port settings after allowing the input and output buffers to drain/empty.
tcsetattr(fd, TCSADRAIN, &options)
TCSBRK
Sends a break for the given time.
tcsendbreak, tcdrain
TCXONC
Controls software flow control.
tcflow
TCFLSH
Flushes the input and/or output queue.
tcflush
TIOCMGET
Returns the state of the "MODEM" bits.
None
TIOCMSET
Sets the state of the "MODEM" bits.
None
FIONREAD
Returns the number of bytes in the input buffer.
None
为获取状态位,调用ioctl函数,用一个整数来存放位指针.
Listing 5 - Getting the MODEM status bits.
#include
#include
int fd;
int status;
只有经过长时间完成其发展的艰苦工作,并长期埋头沉浸于其中的任务,方可望有所成就。——黑格尔
ioctl(fd, TIOCMGET, &status);
Listing 6 - Dropping DTR with the TIOCMSET ioctl.
#include
#include
int fd;
int status;
ioctl(fd, TIOCMGET, &status);
status &= ~TIOCM_DTR;
ioctl(fd, TIOCMSET, status);
只有经过长时间完成其发展的艰苦工作,并长期埋头沉浸于其中的任务,方可望有所成就。——黑格尔