Linux系统 串口设备

本文详细介绍了在Linux系统中如何通过设备文件访问串口设备,包括打开串口、设置通信参数、读写串口以及关闭串口的过程。重点阐述了波特率、数据位、奇偶校验位和数据流控制的设置方法。

    在Linux系统中,串口设备是通过串口终端设备文件来访问的,也就是通过访问/dev/ttyS0、/dev/ttyS1、/dev/ttyS2、/dev/ttyS3这些设备文件实现对串口的访问。对串口进行读写要经过下面几个步骤。

 

 

一、  打开串口

与打开文件类似,打开串口同样使用open函数。注意对于串口的打开操作,必须使用O_NOCTTY参数。该参数表示:如果打开的是一个终端设备,程序不会成为对应这个端口的控制终端。如果没有使用该标志,任何一个输入(例如,键盘中止信号等)都将影响进程。具体代码如下:

    

#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>

int main(void){ … int fd;

//使用open函数打开串口,获得串口设备文件的文件描述符 if((fd=open("/dev/ttyS0",O_RDWR| O_NOCTTY))==-1){ perror("Cannot open the serial port"); return 1; }

… }

 

 

二、  设置串口通信参数

串口通信参数指的是波特率、数据位、奇偶校验位和停止位。对串口实现控制的时候同样要用到termio结构体。下面将结合具体的代码说明如何设置这些参数。

1.波特率设置
获得端口波特率信息是通过cfgetispeed函数和cfgetospeed函数来实现的。cfgetispeed函数用于获得结构体termios_p中的输入波特率信息,而cfgetospeed函数用于获得结构体termios_p中的输出波特率信息。这两个函数的具体信息如表6.9所示。

表6.9   cfgetispeed函数和cfgetospeed函数

头文件

<termios.h>

<unistd.h>

函数形式

speed_t cfgetispeed(const struct termios *termios_p);

speed_t cfgetospeed(const struct termios *termios_p);

返回值

成功

失败

是否设置errno

返回termios_p结构中的输入/输出端口的波特率

−1

cfsetispeed函数和cfsetospeed函数用于设置端口的输入/输出波特率。一般情况下,输入和输出波特率是相等的。cfsetispeed函数和cfsetospeed函数的函数声明信息如表6.10所示。

表6.10   cfsetispeed函数和cfsetospeed函数

头文件

<termios.h>

<unistd.h>

函数形式

int cfsetispeed(struct termios *termios_p, speed_t speed);

int cfsetospeed(struct termios *termios_p, speed_t speed);

返回值

成功

失败

是否设置errno

返回termios_p结构中的输入/输出端口的波特率

−1

cfsetispeed函数和cfsetospeed函数会修改结构体termios_p中的波特率信息,其中参数speed可以使用表6.11中所列出的宏。

表6.11   speed参数常用波特率信息 

宏  定  义

波特率(单位: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

 

 

使用cfsetispeed函数和cfsetospeed函数进行串口波特率设置具体代码如下所示:

    #include <stdio.h>    //头文件定义
#include <unistd.h>
#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 <stdio.h>    //头文件定义 #include <unistd.h> #include < termios.h > …… struct termios 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位。表6.12所示为设置奇偶校验的具体方法。

表6.12   设置奇偶校验位

设    置

具 体 代 码

无校验

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;

下面给出将串口通信的奇偶校验设置为偶校验的例子,具体代码如下:

    #include <stdio.h>    //头文件定义
#include <unistd.h>
#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.数据流控制
数据流控制指是使用何种方法来标志数据传输的开始和结束。可以选择不使用数据流控制、使用硬件进行流控制和使用软件进行流控制。数据流控制设置如表6.13所示。

表6.13  数据流控制设置

设    置

具 体 代 码

不使用数据流控制

opt.c_cflag &= ~CRTSCTS

硬件

opt.c_cflag   |=  CRTSCTS

软件

opt.c_cflag   | = IXON|IXOFF|IXANY

由于使用硬件流控制需要相应连接的电缆,常用的流控制方法还是使用软件进行流控制。下面给出了设置不使用数据流控制的相关代码:

    

#include <stdio.h>    //头文件定义 #include <unistd.h> #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,this is a Serial_Port test!/n }; int send_len=sizeof(sbuf); //发送缓冲区字节数定义 len= write(fd,sbuf,send_len); // if(n == -1) printf("Wirte sbuf error./n"); ……

 

四、 关闭串口

在完成对设备文件读写操作后,需要调用close函数关闭该文件描述符。

Linux系统中查看串口设备信息可以通过多种方式实现,以下是一些常用的方法和命令: ### 查看串口设备文件 串口设备Linux系统中通常以设备文件的形式存在于`/dev`目录下,常见的命名格式为`ttySx`(如`ttyS0`)、`ttyUSBx`或`ttyACMx`。可以使用以下命令列出系统中的串口设备文件: ```bash ls -l /dev/ttyS* /dev/ttyUSB* /dev/ttyACM* ``` 此命令将显示所有与串口相关的设备文件,并帮助识别是否存在可用的串口设备[^2]。 ### 使用`dmesg`命令查看串口设备信息 内核在系统启动过程中会记录串口设备的检测信息,可以通过`dmesg`命令查看这些信息: ```bash dmesg | grep ttyS ``` 该命令将过滤出与串口设备相关的内核日志信息,帮助确认串口设备是否被正确识别[^2]。 ### 查看串口设备驱动信息 Linux系统中的串口设备驱动信息可以通过`/proc/tty/drivers/serial`文件查看: ```bash cat /proc/tty/drivers/serial ``` 此命令将显示当前系统串口设备的驱动信息,包括串口类型、端口号和中断号等。 ### 使用`grep`命令查看系统中注册的串口设备 可以通过查看`/proc/devices`文件来确认系统中注册的串口设备: ```bash grep tty /proc/devices ``` 该命令将列出系统中所有与`tty`相关的设备,其中包括串口设备[^3]。 ### 创建缺失的串口设备文件 如果发现系统中缺少某些串口设备文件,可以手动创建它们。例如,创建`ttyS0`设备文件: ```bash mknod /dev/ttyS0 c 4 64 ``` 此命令将创建一个主设备号为4、次设备号为64的字符设备文件`ttyS0`。 ### 使用`stty`命令配置串口参数 `stty`命令可用于查看和设置串口的通信参数,例如波特率、数据位、停止位和校验位等: ```bash stty -F /dev/ttyS0 ``` 此命令将显示`ttyS0`串口设备的当前配置参数[^1]。 ### 使用`setserial`命令查看和配置串口硬件参数 `setserial`命令可用于查看和配置串口硬件的底层参数,例如I/O地址和中断号等: ```bash setserial /dev/ttyS0 ``` 此命令将显示`ttyS0`串口设备的硬件配置信息。 ### 使用`lsof`命令查看串口设备使用情况 `lsof`命令可用于查看串口设备的使用情况,确认是否有进程正在使用某个串口设备: ```bash lsof /dev/ttyS0 ``` 此命令将列出所有正在使用`ttyS0`串口设备的进程信息。 ### 使用`udevadm`命令查看串口设备详细信息 `udevadm`命令可用于查询系统串口设备的详细信息,包括设备路径、属性和事件等: ```bash udevadm info --query=all --name=/dev/ttyS0 ``` 此命令将显示`ttyS0`串口设备的详细信息,帮助进一步了解设备的配置和状态。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值