Linux下的串口通信
发布时间:2022-01-07 11:19:10
点击上方蓝字关注我们
串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM口,在设备管理器中可以查看到),是采用串行通信方式的扩展接口。串行接口(SerialInterface)是指数据一位一位地顺序传送。其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢,可以用于交换机、电脑主板接口等。
在Linux系统中,一切接文件,因此串口设备是通过串口终端设备文件来访问的,也就是通过访问/dev/ttyS0、/dev/ttyS1、/dev/ttyS2、/dev/ttyS3这些设备文件实现对串口的访问。对串口进行读写要经过下面几个步骤。
与打开文件类似,打开串口同样使用open函数。注意对于串口的打开操作,必须使用O_NOCTTY参数。该参数表示:如果打开的是一个终端设备,程序不会成为对应这个端口的控制终端。如果没有使用该标志,任何一个输入(例如,键盘中止信号等)都将影响进程。具体代码如下:
#include
#include
#include
int main(void)
{
…
int fd;
//使用open函数打开串口,获得串口设备文件的文件描述符
if((fd=open("/dev/ttyS0",O_RDWR|O_NOCTTY))==-1)
{
perror("Cannot open theserial port");
return 1;
}
…
}
……
串口通信参数指的是波特率、数据位、奇偶校验位和停止位。对串口实现控制的时候同样要用到termio结构体。
1.波特率设置
获得端口波特率信息是通过cfgetispeed函数和cfgetospeed函数来实现的。cfgetispeed函数用于获得结构体termios_p中的输入波特率信息,而cfgetospeed函数用于获得结构体termios_p中的输出波特率信息。这两个函数的具体信息如表1所示。
头文件 | #include #include | ||
函数形式 | speed_t cfgetispeed(const struct termios *termios_p); speed_t cfgetospeed(const struct termios *termios_p); | ||
返回值 | 成功 | 失败 | 是否设置errno |
返回termios_p结构中的输入/输出端口的波特率 | −1 | 是 |
表1 cfgetispeed函数和cfgetospeed函数
cfsetispeed函数和cfsetospeed函数用于设置端口的输入/输出波特率。一般情况下,输入和输出波特率是相等的。cfsetispeed函数和cfsetospeed函数的函数声明信息如表2所示。
头文件 | |||
函数形式 | int cfsetispeed(struct termios *termios_p, speed_t speed); int cfsetospeed(struct termios *termios_p, speed_t speed); | ||
返回值 | 成功 | 失败 | 是否设置errno |
返回termios_p结构中的输入/输出端口的波特率 | −1 | 是 |
表2 cfsetispeed函数和cfsetospeed函数
cfsetispeed函数和cfsetospeed函数会修改结构体termios_p中的波特率信息,其中参数speed可以使用表3中所列出的宏。
宏 定 义 | 波特率(单位:bit/s) | 宏 定 义 | 波特率(单位:bit/s) |
B0 | 0 | B1800 | 1800 |
B50 | 50 | B2400 | 2400 |
B75 | 75 | B4800 | 4800 |
B110 | 110 | B9600 | 9600 |
B134 | 134 | B19200 | 19200 |
B150 | 150 | B38400 | 38400 |
B200 | 200 | B57600 | 57600 |
B300 | 300 | B115200 | 115200 |
B600 | 600 | B230400 | 230400 |
B1200 | 1200 |
表3 speed参数常用波特率信息
使用cfsetispeed函数和cfsetospeed函数进行串口波特率设置具体代码如下所示:
#include
#include
#include < termios.h >
……
struct termios opt; /*定义指向termios结构类型的指针opt*/
……
//获得串口指向termios结构的指针
tcgetattr(fd, &Opt);
cfsetispeed(&opt,B9600); /*指定输入波特率,9600bps*/
cfsetospeed(&opt,B9600);/*指定输出波特率,9600bps*/
//将修改后的termios数据设置到串口中
tcsetattr(fd,TCANOW,&Opt);
……
2.数据位
数据位指的是每字节中实际数据所占的比特数。要修改数据位可以通过修改termios结构体中c_cflag成员来实现。CS5、CS6、CS7和CS8分别表示数据位为5、6、7和8。值得注意的是,在设置数据位时,必须先使用CSIZE做位屏蔽。具体设置代码如下:
#include
#include
#include< termios.h >
……
structtermios opt; /*定义指向termios结构类型的指针opt*/
.......
//获得串口指向termios结构的指针
tcgetattr(fd,&Opt);
…
//屏蔽其他标志
Opt.c_cflag&=~CSIZE;
//将数据位修改为8bit
Opt.c_cflag|=CS8;
…
//将修改后的termios数据设置到串口中
tcsetattr(fd,TCANOW,&Opt);
……
3.奇偶校验位
奇偶校验可以选择偶校验、奇校验、空格等方式,也可以不使用校验。如果要设置为偶校验的话,首先要将termios结构体中c_cflag设置PARENB标志,并清除PARODD标志。如果要设置奇校验,要同时设置termios结构体中c_cflag设置PARENB标志和PARODD标志。如果不想使用任何校验的话,清除termios结构体中c_cflag的PARENB位。表4所示为设置奇偶校验的具体方法。
设 置 | 具 体 代 码 |
无校验 | opt.c_cflag &= ~PARENB; |
奇校验 | opt.c_cflag |= (PARODD | PARENB); |
偶校验 | opt.c_cflag &= ~ PARENB; opt.c_cflag &= ~PARODD; |
空格 | opt.c_cflag &= ~PARENB; opt.c_cflag &= ~CSTOPB; |
表4 设置奇偶校验位
下面给出将串口通信的奇偶校验设置为偶校验的例子,具体代码如下:
#include
#include
#include < termios.h >
……
struct termios opt; /*定义指向termios结构类型的指针opt*/
……
//获得串口指向termios结构的指针
tcgetattr(fd, &Opt);
…
opt.c_cflag &= ~ PARENB;
opt.c_cflag &= ~PARODD;
…
//将修改后的termios数据设置到串口中
tcsetattr(fd,TCANOW,&Opt);
……
4.数据流控制
数据流控制指是使用何种方法来标志数据传输的开始和结束。可以选择不使用数据流控制、使用硬件进行流控制和使用软件进行流控制。数据流控制设置如表5所示。
设 置 | 具 体 代 码 |
不使用数据流控制 | opt.c_cflag &= ~CRTSCTS |
硬件 | opt.c_cflag |= CRTSCTS |
软件 | opt.c_cflag | = IXON|IXOFF|IXANY |
由于使用硬件流控制需要相应连接的电缆,常用的流控制方法还是使用软件进行流控制。下面给出了设置不使用数据流控制的相关代码:
#include
#include
#include < termios.h >
……
struct termios opt; /*定义指向termios结构类型的指针opt*/
……
//获得串口指向termios结构的指针
tcgetattr(fd, &opt);
…
opt.c_cflag &= ~CRTSCTS…
//将修改后的termios数据设置到串口中
tcsetattr(fd,TCANOW,&Opt);
……
读写串口是通过使用read函数和write函数实现的。在Linux系统中,对设备的读写类似于对文件的读写。下面给出对串口的写操作的代码:
……
int len;
//待发送数据
char sbuf[]={Hello,thisis a Serial_Port test!/n};
int send_len=sizeof(sbuf);
//发送缓冲区字节数定义
len= write(fd,sbuf,send_len);//
if(n == -1)
printf("Wirte sbuferror./n");
……
在完成对设备文件读写操作后,需要调用close函数关闭该文件描述符。
以上就是关于Linux下串口文件的相关知识,你学会了吗?
- 上一篇:程序员编程入门须知
- 下一篇:4类程序员直呼好用的嵌入式开发辅助工具