1. 串口传输简介
串口传输是计算机与外部设备进行数据传输的一种常见方式。在Linux系统中,可以使用串口(也称为UART)与其他设备进行通信,例如与单片机、传感器等进行数据交互。
2. Linux下串口设备文件
在Linux系统中,串口设备对应的文件位于/dev目录下,通常以tty开头。例如,ttyS0表示第一个串口设备,ttyUSB0表示第一个USB串口设备。通过打开串口设备文件,我们可以读写串口数据。
2.1 打开串口设备文件
在Linux系统中,可以通过C语言的open()函数打开串口设备文件,示例如下:
#include <stdio.h>
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>
int main()
{
int fd;
fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY);
if (fd == -1)
{
perror("Error opening serial port");
return -1;
}
// ...
close(fd);
return 0;
}
在上述代码中,使用open()函数打开了/dev/ttyS0串口设备文件,并且设置了读写权限。如果打开失败,会输出错误信息并返回-1。
2.2 配置串口参数
打开串口设备文件后,我们需要通过设置串口参数来配置通信的波特率、数据位、停止位等参数。可以使用termios结构体来配置串口参数,示例如下:
#include <stdio.h>
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>
int main()
{
int fd;
fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY);
if (fd == -1)
{
perror("Error opening serial port");
return -1;
}
struct termios serial_cfg;
if (tcgetattr(fd, &serial_cfg) != 0)
{
perror("Error getting serial port attributes");
return -1;
}
serial_cfg.c_cflag = B9600 | CS8 | CLOCAL | CREAD;
serial_cfg.c_iflag = IGNPAR;
serial_cfg.c_oflag = 0;
serial_cfg.c_lflag = 0;
if (tcsetattr(fd, TCSANOW, &serial_cfg) != 0)
{
perror("Error setting serial port attributes");
return -1;
}
// ...
close(fd);
return 0;
}
在上述代码中,使用tcgetattr()函数获取当前串口设备的参数,然后通过修改serial_cfg结构体中的各个参数来配置串口。例如,通过设置c_cflag参数可以配置波特率为9600,数据位为8位,无校验位等。最后,使用tcsetattr()函数将修改后的参数应用到串口设备。
3. 串口读写数据
配置完串口参数后,我们可以通过read()和write()函数来进行串口数据的读写。
3.1 读取串口数据
#include <stdio.h>
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>
#define BUFFER_SIZE 256
int main()
{
int fd;
fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY);
if (fd == -1)
{
perror("Error opening serial port");
return -1;
}
// 设置串口参数...
char buffer[BUFFER_SIZE];
ssize_t num_bytes;
num_bytes = read(fd, buffer, BUFFER_SIZE);
if (num_bytes == -1)
{
perror("Error reading from serial port");
return -1;
}
else
{
printf("Received %ld bytes from serial port\n", num_bytes);
// 对接收到的数据进行处理...
}
// ...
close(fd);
return 0;
}
在上述代码中,使用read()函数从串口设备中读取数据,读取的数据存放在buffer数组中。read()函数返回实际读取的字节数,如果返回-1,则表示读取错误。
3.2 发送串口数据
#include <stdio.h>
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>
int main()
{
int fd;
fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY);
if (fd == -1)
{
perror("Error opening serial port");
return -1;
}
// 设置串口参数...
char *data = "Hello, serial port!";
ssize_t num_bytes;
num_bytes = write(fd, data, strlen(data));
if (num_bytes == -1)
{
perror("Error writing to serial port");
return -1;
}
else
{
printf("Sent %ld bytes to serial port\n", num_bytes);
}
// ...
close(fd);
return 0;
}
在上述代码中,使用write()函数向串口设备发送数据。需要注意的是,write()函数的第二个参数是待发送数据的缓冲区指针,第三个参数是待发送数据的字节数。
4. 结束语
本文介绍了在Linux系统中实现串口传输的方法。通过打开串口设备文件并配置串口参数,我们可以实现与外部设备的数据交互。同时,通过read()函数读取串口数据和write()函数发送串口数据,我们可以实现与外部设备的实时通信。
在实际的应用中,还可以根据需要进一步封装串口读写函数,提高代码复用性和可扩展性。另外,对于复杂的串口通信协议,我们还可以使用专门的库来简化开发过程。