Linux系统下的UART测试程序详解 (linux uart测试程序)

引言

UART是一种常用的串行通信接口,常用于单片机和外围设备之间进行数据传输。Linux系统下提供了丰富的串口通信工具和库函数,可以非常方便地进行串口通信测试和开发。本文将介绍Linux系统下的UART测试程序,详细讲解其原理、实现和使用方法。

一、UART简介

UART(Universal Asynchronous Receiver/Tranitter)是一个通用异步串行接口,它可以支持异步传输和少量同步传输。在UART串口通信中,数据以字节为单位通过串行通信线路进行传输,通信线路包括一条单向数据线(TX)和一条单向接收线(RX),同时还有一个以上的控制线(如CTS、RTS等)。

在UART通信中,数据传输是以一定波特率进行的。波特率表示传输速率,即单位时间内传输的比特数。例如,对于波特率为9600 bps的UART串口通信,每秒可以传输9600个比特(即9600/8=1200个字节)的数据。波特率越高,传输速度越快,但是传输距离越短,误码率越高。

二、UART测试程序原理

Linux系统下提供了多种测试UART串口通信的工具和库函数,例如minicom、stty、termios等。这些工具和库函数都是基于系统调用函数编写的,主要目的是为了方便用户进行串口通信的测试和开发。而本文将介绍一种基于C语言的UART测试程序,它可以直接调用串口设备文件的读写函数进行数据的收发。具体原理如下:

1. 打开串口设备文件

在Linux系统下,每个串口都会被表示为一个设备文件,例如/dev/ttyS0、/dev/ttyS1等。在UART测试程序中,首先需要打开指定的串口设备文件,以便后续进行数据的读写。

2. 设置串口参数

在进行串口通信时,需要设置一些参数,如波特率、数据位、校验位、停止位等。通过串口控制寄存器,可以对这些参数进行设置。在UART测试程序中,可以通过调用tcgetattr和tcsetattr等函数设置指定的串口参数。

3. 发送数据

在UART测试程序中,可以通过调用write函数向串口发送数据。write函数会将指定的数据写入串口设备文件,发送给外部设备。

4. 接收数据

在UART测试程序中,可以通过调用read函数从串口接收数据。read函数会从串口设备文件中读取数据,存储到缓冲区中,供后续进行处理。

5. 关闭串口设备文件

在串口通信完成后,需要关闭打开的串口设备文件,以便下次进行访问。

三、UART测试程序实现

基于上述原理,可以编写C语言程序实现UART测试功能。下面给出一段完整的UART测试程序代码:

#include

#include

#include

#include

#include

int set_interface_attribs (int fd, int speed, int parity)

{

struct termios tty;

memset (&tty, 0, sizeof tty);

if (tcgetattr (fd, &tty) != 0)

{

perror (“error %s from tcgetattr”);

return -1;

}

cfsetospeed (&tty, speed);

cfsetispeed (&tty, speed);

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

// disable IGNBRK for miatched speed tests; otherwise receive break

// as \000 chars

tty.c_iflag &= ~IGNBRK; // disable break processing

tty.c_lflag = 0; // no signaling chars, no echo,

// no canonical processing

tty.c_oflag = 0; // no remapping, no delays

tty.c_cc[VMIN] = 0; // read doesn’t block

tty.c_cc[VTIME] = 5; // 0.5 seconds read timeout

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

tty.c_cflag |= (CLOCAL | CREAD);// ignore modem controls,

// enable reading

tty.c_cflag &= ~(PARENB | PARODD); // shut off parity

tty.c_cflag |= parity;

tty.c_cflag &= ~CSTOPB;

tty.c_cflag &= ~CRTSCTS;

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

{

perror (“error %s from tcsetattr”);

return -1;

}

return 0;

}

void set_blocking (int fd, int should_block)

{

struct termios tty;

memset (&tty, 0, sizeof tty);

if (tcgetattr (fd, &tty) != 0)

{

perror (“error %s from tggetattr”);

return;

}

tty.c_cc[VMIN] = should_block ? 1 : 0;

tty.c_cc[VTIME] = 5; // 0.5 seconds read timeout

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

perror (“error %s setting term attributes”);

}

int mn()

{

char buf[256];

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

if (fd

{

perror(“error opening”);

return -1;

}

set_interface_attribs(fd, B9600, 0); // set speed to 9600 bps, 8n1 (no parity)

set_blocking(fd, 0); // set no blocking

write(fd, “hello\n”, 6); // send 6 character greeting

usleep ((6 + 25) * 100); // sleep enough to tranit the 6 plus

// receive 25: approx 100 uS per char tranit

int n = read(fd, buf, sizeof buf); // read up to 100 characters if ready to read

printf(“received %d bytes: %s\n”, n, buf);

close(fd);

return 0;

}

本段代码中,首先通过调用open函数打开指定的串口设备文件(/dev/ttyS0),然后通过tcgetattr和tcsetattr函数设置串口参数(波特率为9600,数据位为8位,校验位为无,停止位为1位)。通过write函数向串口发送一条数据“hello\n”,并通过read函数从串口接收数据,存储到buf缓冲区中。

在进行编译时,需要将此代码保存为uart_test.c文件,并通过gcc命令进行编译:

$ gcc uart_test.c -o uart_test

四、UART测试程序使用方法

在Linux系统上,进行UART测试时需要先连接好串口线,将串口设备连接到计算机上。然后,执行上述编译好的uart_test程序即可进行测试。如果测试通过,可以在终端上看到接收到的数据。

需要注意的是,在Linux系统下,串口设备文件的权限可能需要进行修改才能进行读写操作。可以通过chmod命令进行修改,例如:

$ sudo chmod 666 /dev/ttyS0

这条命令将/dev/ttyS0串口设备文件的权限设置为666,即所有用户都有读写权限。

结论


数据运维技术 » Linux系统下的UART测试程序详解 (linux uart测试程序)