串口开发主要有三个方面介绍:
1、 串口概述
2、 串口设置
3、 串口的使用详解
一、串口的概述:常见的串口数据通信方式:并行通信和串行通信;
串行通信是计算机通信常见数据接口,如:RS-232-C,该标准规定采用一个DB25芯连接器和DB9芯连接器。简单的介绍一下DB25和DB9,这里主要用到了其中的三个引脚,一个发送数据(TXD),一个接受数据(RXD),一个接地(GND)。只要去控制这三个引脚就可以。
芯片内部含有UART控制器,其工作方式主要有中断模式(Interrupt)和直接内存访问(DMA)两种工作方式;还有一种是查询方式,这种工作模式我到目前在工作过程中还没有遇到过。串口驱动的编程实质上就是对UART控制器的操作实现。
UART操作主要包括以下几个部分:
1, 数据发送;
2, 数据接收;
3, 产生中断;
4, 产生波特率;
5, 红外模式;
6, Loopback模式;
7, 自动流控制模式;
串口参数的配置主要包括:波特率,数据位,校验位,停止位,流控协议。
Linux下串口设备存放的位置是/dev文件或是说Linux的操作的设备基本都存放在该目录下;
有多个串口设备时对应的设备名分别是:/dev/ttyS0、/dev/ttyS1、/dev/ttyS2依次增加,在Linux下操作串口和操作文件是相同的,也就是需要open,write,read,close等函数对串口进行打开,读写,关闭的操作;
二、串口的详细配置
在使用串口时必须对其进行相关的配置:如波特率,数据位,校验位,停止位等;
串口的设置具体由下面的数据结构体实现:
Struct termios
{
unsigned shortc_iflag; /* 输入模式标志*/
unsigned shortc_oflag; /* 输出模式标志*/
unsigned shortc_cflag; /* 控制模式标志*/
unsigned shortc_lflag; /*区域模式标志或本地模式标志或局部模式*/
unsigned charc_line; /*行控制linediscipline */
unsignedchar c_cc[NCC];/* 控制字符特性*/
};
该结构体中最重要的就是c_cflag标志;它可以设置波特率,检验位,停止位,数据位等,在设置波特率时要在前面加上“B”,如B9600,B15200。使用其要通过“&”,“|”,等操作方式。
其次是输入标志c_iflag成员控制端口接收字符处理;termios 结构中这两个成员都有很多的操作标志宏:
c_cflag: c_iflag:
CCTS_OFLOW;输出的CTS流控制; BRKINT;接到BREAK时产生SIGINT
CIGNORS; 忽略控制标志; ICRNL;将输入的CR转化为NL;
CLOCAL; 忽略解制-解调器状态行; IGNBRK;忽略BREAK条件
CREAD; 启用接收装置 IGNBCR;忽略CR
CRTS_IFLOW; 输入RTS流控制 IGNPAR;忽略奇偶错字符
CSIZE; 字符大小屏蔽 IMAXBEL;在输入列空时振铃;
CSTOPB;设置两个停止位,否则为1位 INLCR;将输入的NL转化为CR
HUPCL;最后关闭时断开 INPCK;打开输入奇偶校验;
MDMBUF;经载波的流控制输出
PARENB;进行奇偶校验
PARODD;奇校验,否则为偶校验
接下来就是串口的控制函数:
Tcgetattr;获取属性;
Tcsetattr:设置属性;
cfgetispeed;获取输入速度
cfgetospeed;获取输出速度;
cfsetispeed;设置输入速度;
cfsetospeed;设置输出速度;
Tcdrain;等待所有输出被传输;
tcflow;挂起传输或接收;
tcflush;刷清未决输入和/或输出;
Tcsendbreak;送BREAK字符;
tcgetpgrp;获取前台进程组ID;
tcsetpgrp;设置前台进程组ID;
串口的配置流程:
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_cflag&= ~CSIZE;
newtio.c_cflag|= CS8;
5. 设置奇偶校验,使用c_cflag和c_iflag设置奇偶校验;
设置奇校验:
newtio.c_cflag |= PARENB;
newtio.c_cflag |= PARODD;
newtio.c_iflag |= (INPCK| ISTRIP);
设置偶校验:
newtio.c_iflag |= (INPCK| ISTRIP);
newtio.c_cflag |= PARENB;
newtio.c_cflag |= PARODD;
newtio.c_cflag &= ~PARENB;
6. 设置停止位。通过激活c_cflag中的CSTOPB实现。若停止位为1位,则清除CSTOPB,若停止位为2,则激活CSTOPB;
newtio.c_cflag & = ~CSTOPB;
7. 设置最少字符和等待时间,对于接收字符和等待时间一般没有特别要求,全都设置为0;
newtio.c_c[VMIN] = 0;
newtio.c_c[VTIME] = 0;
8. 处理要写入的引用对象
tcflush函数刷清输入缓存或输出缓存;
函数原型:int tcflush(int filedes,int queue)
Queue数应该是下列三个常数之一:
·TCIFLUSH刷清输入队列;
·TCOFLUSH刷清输出队列;
·TCIOFLUSH刷清输入输出队列;
9.激活配置。在完成配置后,需要激活配置使其生效,使用tsettattr()函数。原型:
int tcgetattr(int filedes, struct termiso *termptr);
int tcsetattr(int filedes, int opt, conststruct termios *termptr);
到此串口的基本配置就完成了,接下来就是根据上述所说实现串口设备的访问。详见串口编程二