Linux串口编程

1.打开串口
在Linux下串口文件是位于 /dev下的
串口一为 /dev/ttyS0
串口二为 /dev/ttyS1
打开串口是通过使用标准的文件打开函数操作
例如:
int fd;//以读写的方式打开串口
fd = open(“/dev/ttyS0”,O_RDWR);

2.设置串口
最基本的设置串口包括波特率设置,效验位和停止位设置。
串口的设置主要是设置struct termios 结构体的成员值。
struct termio
{
unsigned short c_iflag;//输入模式标志
unsigned short c_oflag;//输出模式标志
unsigned short c_cflag;//控制模式标志
unsigned short c_lflag;//本地模式标志
unsigned char c_line;//line discipline
unsigned char c_cc[NCC];//control characters,控制特征
}
其中,最重要的是c_cflag最为重要,可设置波特率,数据位,校验位,停止位。在设置波特率时需在数字前加上B,如B9600.B19200。使用其需通过“与”“或”操作方式。

3.串口控制函数
Tcgetattr 取属性(termios结构)
Tcsetattr 设置属性(termios结构)
cfgetispeed 得到输入速度
Cfgetospeed 得到输出速度
Cfsetispeed 设置输入速度
Cfsetospeed 设置输出速度
Tcdrain 等待所有输出都被传输
tcflow 挂起传输或接收
tcflush 刷清未决输入或输出
Tcsendbreak 送BREAK字符
tcgetpgrp 得到前台进程组ID
tcsetpgrp 设置前台进程组ID

4.设置串口流程
(1.)保存原先串口配置使用tcgetattr(fd,&oldtio)函数
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 c_cflag &= ~CSIZE;
newtio.c c_cflag |= ~CS8;
(5.)设置奇偶校验位,使用c_cflag和c_iflag。
设置奇校验:
newtio.c_cflag |= PARENB;
newtio.c_cflag |= PARODD;
newtio.c_Iflag |= (INPCK | ISTRIP);
(6.)设置偶校验:
newtio.c_iflag |= (INPCK | ISTRIP);
newtio.c_cflag |= PARENB;
newtio.c_cflag &= ~PARODD;
(7.)设置停止位,通过激活c_cflag中的CSTOPB实现。若停止位为1,则清除CSTOPB,若停止位为2,则激活CSTOPB。
newtio.c_cflag &= ~CSTOPB;
(8.)设置最少字符和等待时间,对于接收字符和等待时间没有特别要求时,可设为0。
newtio.c_cc[VTIME] = 0;
newtio.c_cc[VMIN] = 0;
(9.)处理要写入的引用对象
tcflush函数刷清(抛弃)输入缓存(终端驱动程序已接收到,但用户程序尚未读)或输出缓存(用户程序已经写,但尚未发送)。
int tcflush(int filedes,int queue)
queue数应当是下列三个常数之一:
TCIFLUSH 刷清输入队列。
TCOFLUSH 刷清输出队列。
TCIOFLUSH 刷清输入,输出队列。
如:tcflush(fd,TCIFLUSH);
(10.)激活配置。在完成配置后,需激活配置使其生效。使用tsettattr()函数。原型:
int tcgetattr(int filedes,struct termios *termptr);
int tcsetattr(int filedes,int opt,const struct termios *termptr);
tcsetattr的参数opt使我们可以指定在什么时候新的终端属性才起作用。opt可以指定为下列常数中的一个:
TCSANOW 更改立即发生。
TCSADRAIN 发送了所有输出后更改才发生。若更改输出参数则应使用此选择项。
TCSAFLUSH 发送了所有输出后更改才发生。更进一步,在更改发生时未读的所有输入数据都被删除(刷清)使用如:tcsetattr(fd,TCSANOW,&newtio)

你可能感兴趣的:(嵌入式linux,linux)