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) |