/dev/ttySx
(/dev/ttyS1
) 设备文件来访问串行端口。通过命令 stty
配置波特率、数据位等参数,然后使用 echo
或 cat
命令进行数据传输。在Linux系统中,串口通信是一个常见的任务,尤其在嵌入式系统和硬件调试中,串口(Serial Port)是计算机上用于串行通信的端口,通常用于连接外部设备如传感器、GPS模块、条码扫描器等,本文将详细介绍如何在Linux系统中进行串口编程,包括打开串口、配置串口参数、读写数据以及关闭串口的步骤。
打开串口
在Linux中,串口设备通常被表示为/dev/ttyS
或/dev/serial/by-id/
,第一个串口通常是/dev/ttyS0
或/dev/serial/by-id/usb-FTDI_FT232R-if00-port0
。
使用C语言中的open()
函数可以打开串口:
int serial_port = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_SYNC); if (serial_port < 0) { perror("Error opening serial port"); return -1; }
配置串口参数
使用termios
结构体来配置串口参数,包括波特率、字符大小、停止位、校验位等。
struct termios tty; memset(&tty, 0, sizeof(tty)); // 获取当前串口配置 if (tcgetattr(serial_port, &tty) != 0) { perror("Error from tcgetattr"); return -1; } // 设置波特率为9600 cfsetospeed(&tty, B9600); cfsetispeed(&tty, B9600); // 设置8N1模式(8个数据位,无校验位,1个停止位) tty.c_cflag &= ~PARENB; // 清除奇偶校验位 tty.c_cflag &= ~CSTOPB; // 设置为1个停止位 tty.c_cflag &= ~CSIZE; // 清除数据位设置 tty.c_cflag |= CS8; // 设置为8个数据位 // 应用配置 if (tcsetattr(serial_port, TCSANOW, &tty) != 0) { perror("Error from tcsetattr"); return -1; }
读写数据
使用read()
和write()
函数进行数据的读取和写入。
// 写数据到串口 const char *data = "Hello, serial port!"; int len = write(serial_port, data, strlen(data)); if (len < 0) { perror("Error writing to serial port"); return -1; } // 从串口读取数据 char read_buf[100]; memset(read_buf, '\0', sizeof(read_buf)); int num_bytes = read(serial_port, &read_buf, sizeof(read_buf)); if (num_bytes < 0) { perror("Error reading from serial port"); return -1; } else { printf("Read %d bytes: %s ", num_bytes, read_buf); }
关闭串口
完成通信后,记得关闭串口以释放资源。
close(serial_port);
示例代码汇总
以下是一个完整的示例代码,展示了如何在Linux中使用C语言进行串口通信:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> #include <termios.h> int main() { int serial_port = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_SYNC); if (serial_port < 0) { perror("Error opening serial port"); return -1; } struct termios tty; memset(&tty, 0, sizeof(tty)); if (tcgetattr(serial_port, &tty) != 0) { perror("Error from tcgetattr"); return -1; } cfsetospeed(&tty, B9600); cfsetispeed(&tty, B9600); tty.c_cflag &= ~PARENB; tty.c_cflag &= ~CSTOPB; tty.c_cflag &= ~CSIZE; tty.c_cflag |= CS8; if (tcsetattr(serial_port, TCSANOW, &tty) != 0) { perror("Error from tcsetattr"); return -1; } const char *data = "Hello, serial port!"; int len = write(serial_port, data, strlen(data)); if (len < 0) { perror("Error writing to serial port"); return -1; } char read_buf[100]; memset(read_buf, '\0', sizeof(read_buf)); int num_bytes = read(serial_port, &read_buf, sizeof(read_buf)); if (num_bytes < 0) { perror("Error reading from serial port"); return -1; } else { printf("Read %d bytes: %s ", num_bytes, read_buf); } close(serial_port); return 0; }
FAQs
Q1: 如何更改串口的波特率?
A1: 要更改串口的波特率,可以使用cfsetospeed()
和cfsetispeed()
函数,要将波特率设置为115200,可以使用以下代码:
cfsetospeed(&tty, B115200); cfsetispeed(&tty, B115200);
然后重新应用配置:
tcsetattr(serial_port, TCSANOW, &tty);
Q2: 如果串口设备文件不存在怎么办?
A2: 如果串口设备文件不存在,首先确认串口设备已正确连接到计算机,并且驱动程序已加载,可以使用dmesg | grep tty
命令查看系统日志,检查是否有关于串口设备的提示信息,如果设备未列出,可能需要检查硬件连接或安装适当的驱动程序。
到此,以上就是小编对于“linux写串口”的问题就介绍到这了,希望介绍的几点解答对大家有用,有任何问题和不懂的,欢迎各位朋友在评论区讨论,给我留言。