
在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 [email protected]
“`
三、
打开串口是进行外设调试和控制的一项重要操作。虽然在Linux下打开串口有一定的难度,但通过本文介绍的方法,您应该已经了解了如何正确地打开和使用串口。无论是使用命令行工具,还是在程序中使用串口,您都应该能够得心应手地完成它们。祝你好运!
相关问题拓展阅读:
- Linux C 配置串口
- 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 串口通讯问题的信息别忘了在本站进行查找喔。
香港服务器首选树叶云,2H2G首月10元开通。
树叶云(www.IDC.Net)提供简单好用,价格厚道的香港/美国云服务器和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。
文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/186676.html<