您的位置:

Linux串口编程详解

一、使用串口进行数据通信

串口是计算机与外部设备进行通信的一种常见方式,在很多嵌入式系统和嵌入式设备上也广泛应用。在Linux系统中,可以使用串口进行数据通信,具体流程如下:

1、打开串口:首先需要使用Linux的系统调用函数打开串口设备文件,并以读写方式打开:

#include<fcntl.h>
#include<termios.h>

int fd;
struct termios options; 

fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1) {
   // 打开失败的处理逻辑。。。
}

// 配置串口
tcgetattr(fd, &options);
cfsetispeed(&options, B9600);
cfsetospeed(&options, B9600);

options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
options.c_oflag &= ~OPOST;

tcsetattr(fd, TCSANOW, &options);

2、配置串口属性:配置需要与外部设备进行通信的串口属性,例如波特率、数据位、停止位等:

struct termios options; 

tcgetattr(fd, &options);
cfsetispeed(&options, B9600);
cfsetospeed(&options, B9600);

options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
options.c_oflag &= ~OPOST;

tcsetattr(fd, TCSANOW, &options);

3、读写数据:使用系统调用函数对串口进行读写操作,例如read()和write():

char buf[100];
int len = read(fd, buf, 100);
if (len > 0) {
   // 处理读到的数据
}

char data[] = "Hello world!";
write(fd, data, strlen(data));

二、串口数据收发原理

串口数据是以二进制流的形式传输的,因此需要在发送和接收数据时对数据进行编码和解码。在串口通信中常用的编解码方式有 ASCII 码、BCD 码、二进制数等。

对于串口的发送和接收,主要有以下的处理逻辑:

1、发送数据:主机将数据转换为二进制码,通过串口进行传输。接收端将二进制码进行解码,还原为原来的数据。

2、接收数据:接收端将从串口中接收到的二进制码进行解码,还原为原来的数据。主机再将数据转换为二进制码进行发送。

三、串口编程实例

下面是一个简单的串口编程实例,用于在Linux系统中使用串口进行数据通信:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<fcntl.h>
#include<errno.h>
#include<termios.h>

int main(void)
{
    int fd_serial, n_usec;
    char buffer[256];
    char *device_name = "/dev/ttyS0";
    speed_t baudrate = B9600;

    fd_serial = open(device_name, O_RDWR | O_NOCTTY | O_NDELAY);
    if(fd_serial < 0)
    {
        printf("Failed to open serial device\n");
        return -1;
    }

    struct termios port_settings;       
    tcgetattr(fd_serial, &port_settings);     
    cfsetospeed(&port_settings, baudrate);   
    cfsetispeed(&port_settings, baudrate);   
    port_settings.c_cflag &= ~PARENB;    
    port_settings.c_cflag &= ~CSTOPB;    
    port_settings.c_cflag &= ~CSIZE;     
    port_settings.c_cflag |= CS8;       
    port_settings.c_cflag |= CREAD;      
    tcsetattr(fd_serial, TCSANOW, &port_settings); 

    for(;;)
    {
        int n = read(fd_serial, buffer, sizeof(buffer));
        if(n > 0)
        {
            buffer[n] = 0; // 将读到的数据以字符串形式进行处理
            printf("Received data: %s\n", buffer); 
        }

        n_usec = 10000; // 等待10毫秒
        usleep(n_usec);
    }

    close(fd_serial);
    return 0;
}

四、小结

本文详细介绍了Linux下的串口编程方法,包括串口的基本使用、数据收发原理以及一个简单的串口编程实例。读者可以通过本文的介绍,深入了解串口通信以及在Linux系统中的应用。