Linux独占:打开串口的正确姿势 (linux独占打开串口)

在Linux操作系统下,串口 (serial port) 是一种非常有用的接口。它可用于连接各种外设,例如调制解调器、无线电设备、传感器等。但对于很多用户来说,打开串口却是一项很棘手的任务。尤其是在Linux下,要正确地打开串口需要掌握一些基本的知识和技巧。本文将介绍Linux下打开串口的正确姿势。

一、硬件设置

在打开串口之前,需要确保所连接的串口设备已经正确地接线和配置。首先需要确认串口的端口号。串口通常使用/dev/ttyS* (0-3) 格式的设备文件名。可以使用以下命令查看系统中可用的串口:

“`bash

$ dmesg |grep tty

“`

如果没有任何输出,基本上可以断定系统中没有串口设备。如果有输出,则可以看到系统中已经识别出来的串口设备,例如:

“`bash

[ 0.686053] serial8250: ttyS0 at I/O 0x3f8 (irq = 4, base_baud = 115200) is a 16550A

[ 0.706813] 00:0c: ttyS0 at I/O 0x3f8 (irq = 4, base_baud = 115200) is a 16550A

“`

其中,ttyS0 表示某个串口设备的名称,I/O 0x3f8 表示该设备的地址,irq=4 表示该设备的中断号,base_baud=115200 表示设备的波特率。(注:上述示例中的”0x3f8″的意思是16进制的3f8。)

如果需要更改设备的波特率或其他参数,可以使用 stty 命令进行设置。例如,以下命令将波特率设置为9600:

“`bash

$ stty -F /dev/ttyS0 9600

“`

当然,此时需要确保连接到 ttyS0 的另一端的设备也以9600波特率工作。

二、使用串口

在Linux下,可以使用多种方式访问串口。以下是三种最常见的方式。

1. 通过标准输入输出进行串口通信。例如,以下命令将从串口ttyS0接收10个字节并将它们写入到stdout流中:

“`bash

$ dd if=/dev/ttyS0 of=/dev/stdout count=10

“`

可以使用管道和重定向将收到的数据写入到文件中,例如:

“`bash

$ dd if=/dev/ttyS0 of=output.txt count=10

“`

类似地,可以通过以下命令向串口ttyS0发送文本:

“`bash

$ echo -n “hello” > /dev/ttyS0

“`

2. 使用串口调试工具,例如 minicom、gtkterm 或 cutecom 等,这些工具具有更友好的用户界面和更多的功能。 例如,使用 minicom 工具可以通过以下命令打开串口ttyS0:

“`bash

$ minicom -D /dev/ttyS0

“`

更多 minicom 的使用请查看相关文档。

3. 在程序中使用串口。程序可以使用标准的文件I/O函数来对串口进行读写。例如,在C语言程序中可以使用以下代码打开串口、设置波特率和数据位数:

“`c

int fd = open(“/dev/ttyS0”, O_RDWR | O_NOCTTY | O_NDELAY);

if (fd

perror(“open”);

return -1;

}

struct termios tty;

memset(&tty, 0, sizeof(tty));

if(tcgetattr(fd, &tty)

perror(“tcgetattr”);

return -1;

}

cfsetospeed(&tty, B115200);

cfsetispeed(&tty, B115200);

tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8; // 8-bit characters

tty.c_cflag |= CLOCAL | CREAD; // ignore modem controls, enable reading

tty.c_iflag &= ~(IXON | IXOFF | IXANY); // shut off xon/xoff ctrl

tty.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // make raw

tty.c_oflag &= ~OPOST; // make raw

tty.c_cc[VMIN] = 0;

tty.c_cc[VTIME] = 5;

if (tcsetattr(fd, TCSANOW, &tty) != 0) {

perror(“tcsetattr”);

return -1;

}

“`

这里的代码使用了 termios 结构体来设置串口的属性。需要注意的是,一些Linux发行版可能默认启用了串口终端。如果正在使用使用串口终端,则可能会影响串口的调试。要禁用串口终端,请使用以下命令:

“`bash

$ systemctrl stop serial-getty@ttyS0.service

“`

三、

打开串口是进行外设调试和控制的一项重要操作。虽然在Linux下打开串口有一定的难度,但通过本文介绍的方法,您应该已经了解了如何正确地打开和使用串口。无论是使用命令行工具,还是在程序中使用串口,您都应该能够得心应手地完成它们。祝你好运!

相关问题拓展阅读:

Linux C 配置串口

配置串口需要包含

头文件

其中最核心的配置

结构体

为:

如何获取该结构呢?我们操作串口跟操作文件一样,也是调用 open() 函数来打开串口,

这样我们就能够得到一个

文件描述符

fd ,然后就可以调用 tcgetattr() 函数来获取上述配置结构体了。

Linux 串口默认的配置为:

波特率

9600,数据位 8 位,无

奇偶校验

,停止位 1 位,无 CTS/RTS 。

以下介绍一些常用的配置项:波特率、奇偶校验、数据位、停止位、硬件控制流。

相关接口:

Linux 将串口的波特率辩笑分为了输入波特率和输出波特率,不过最常用的场景是将两者设置成一样。

cfgetispeed() 函数获取输入波特率, cfgetospeed() 函数获取输出波特率。 cfsetispeed() 函数设置输入波特率, cfsetospeed() 函数用于设置输如掘出波特率,当然 cfsetspeed() 函数扩展为同时设置输入和输出波特率。

上述接口中的 speed_t 是一系列波特率的标志位,例如常用的波特率就为 B115200,参考下述选项:

设置奇渣灶核偶校验位可以通过修改 termios 结构体中的 c_cflag 成员来实现,若无校验,则将 PARENB 位设为 0;若有校验,则 PARENB 为 1。之后再根据 PARODD 来区分奇偶校验, PARODD 为 1 表示奇校验, PARODD 为 0 表示偶校验。例如设置无奇偶校验位:

设置数据位可以通过修改 termios 结构体中的 c_cflag 成员来实现,CS5、CS6、CS7 和 CS8 分别代表数据位 5、6、7 和 8。不过在设置数据位之前,需要先用 CSIZE 来做屏蔽字段,清楚这几个标志位,例如设置数据位为 8 位:

设置停止位可以通过修改 termios 结构体中的 c_cflag 成员来实现, CSTOPB 位为 1 表示 2 位停止位, CSTOPB 位为 0 标志 1 位停止位。例如设置停止位为 1 位:

设置硬件控制流可以通过修改 termios 结构体中的 c_cflag 成员来实现, CRTSCTS 为 1 表示使用硬件控制流,为 0 表示不使用硬件控制流。例如

使能

硬件控制流:

当然,最后还需要用 tcflush() 抛弃存储在 fd 里的未接收的数据。

再利用接口 tcsetattr() 函数将配置信息写入文件描述符 fd :

这样整个串口最常用的用法就配置完成了。

具体的配置使用可以参考我的项目 HCI-Middleware 里的 hci_transport_uart_linux.c 文件。

参考:

Linux 串口通讯问题

Linux系统通过这两个号唯一的确定一个驱动实例。

一个实际存在的串口只能够存在一个驱动实例。大多数的驱动实例只支持单一现成的读写操作,所以不允裂薯许多个程序御源扒同时打开设备文件,典型的一种就是串口,它只允许一个程序打开。

一个驱动实例对应一组唯一的主设备号和次设备号,多个设备节点可以指向同一组设备号。

下面是结论:

不论如何更改ttyS0,串口只能打开一次。

可以通过简单的cp /dev/ttyS0 /dev/ttyS4将设备节点的名称复制为/dev/ttyS4,或者使用mv命令对名称进行修改,但是不能改变串口只能打开一次的状况。镇昌

你的中端是否够

com4中断是否打开

超过com4得看看中断是否够不够的话屏蔽掉蠢虚念一誉世些带困pci的rom

linux独占打开串口的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux独占打开串口,Linux独占:打开串口的正确姿势,Linux C 配置串口,Linux 串口通讯问题的信息别忘了在本站进行查找喔。


数据运维技术 » Linux独占:打开串口的正确姿势 (linux独占打开串口)