Luckfox Pico UART 使用教程

拉灯是我干掉的
原创
发布时间: 2025-06-25 09:55:21 | 阅读数 0收藏数 0评论数 0
封面
RV1103是一款专门用于人工智能相关应用的高度集成 IPC 视觉处理器 SoC。它基于单核 ARM Cortex-A7 32 位内核,集成了 NEON 和 FPU,并内置 NPU 支持 INT4 / INT8 / INT16 混合运算,计算能力高达 0.5TOPs。LuckFox Pico是基于瑞芯微 RV1103 芯片的低成本微型 linux 开发板。本文为你介绍它的UART使用方法,学习如何使用串口和终端设备。。
1

终端设备介绍

终端设备,简称 TTY(Teletypewriter的缩写),最早源于电传打字机,用于与计算机进行交互通信。TTY 最初指代连接到Unix系统上的物理或虚拟终端。随着时间的推移,TTY 的概念也扩展到串口设备,如ttyn、ttySACn等。在 Linux 系统中,终端设备的支持非常强大,它们通常通过特殊的设备文件进行访问和控制,从而实现串口通信。这些设备文件位于 /dev 目录下,可以通过它们来读取和写入数据,以及执行各种终端控制操作。

2

查看串口引脚分布

LuckFox Pico 有三个串口,UART2、UART3 和 UART4,其中 UART2 为调试串口。

3

配置串口

  1. 查看设备目录

在 /dev 目录中,每个 UART 设备都有其自己的目录。这些目录的名称是 ttyS 加上串口号,例如 /dev/ttyS3 表示 UART3。您可使用如下命令查看:

# ls /dev/ttyS*
/dev/ttyS3 /dev/ttyS4
  1. 用stty工具查询其通信参数
# stty -F /dev/ttyS3
speed 9600 baud; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-brkint -imaxbel
  1. 修改波特率,其中ispeed为输入速率,ospeed为输出速率
# stty -F /dev/ttyS3 ispeed 115200 ospeed 115200
  1. 关闭回显
stty -F /dev/ttyS3 -echo


4

与Windows主机通讯

  1. 将串口模块一端连接电脑,另一端连接 LuckFox Pico 的引脚18(GND)、19(UART7_TX)和20(UART7_TX)上。
  2. 下载并打开 MobaXterm,选择串口,设置波特率(默认为9600,请根据自己实际修改过的数值设置)。
  3. 在开发板上的终端执行以下指令,使用 echo 命令向终端设备文件写入字符串"Hello"和"world !":
echo Hello > /dev/ttyS3
echo "world !" > /dev/ttyS3
  1. Windows 上的串口调试助手会接收到内容:

Hello

world !

在上图中也有明确的展示。

5

串口通信(C程序)

在前文中,我们演示了如何使用 Shell 命令实现串口通讯。此外,我们还可以使用C库函数或系统调用来读写设备文件,以达到串口通信的目的。

1.打开串口

这段代码首先让用户选择使用串口3或串口4进行通信,然后打开了相应的串口设备文件,将其文件描述符保存在 serial_fd 变量中。

printf("Select a serial port (3/4): ");
scanf("%d", &serial_port_num);

sprintf(serial_port,"/dev/ttyS%d",serial_port_num);
int serial_fd;

serial_fd = open(serial_port, O_RDWR | O_NOCTTY);
if (serial_fd == -1) {
perror("Failed to open serial port");
return 1;
}

2. 配置串口

在这部分代码中,我们定义了一个名为 tty 的 termios 结构体,用于配置串口通信的参数。首先,我们使用 memset 将其初始化为0。然后,通过 tcgetattr 函数获取当前串口的属性,并将其存储在 tty 结构体中。

struct termios tty;
memset(&tty, 0, sizeof(tty));

if (tcgetattr(serial_fd, &tty) != 0) {
perror("Error from tcgetattr");
return 1;
}

在这部分代码中,我们设置了串口通信的一些参数。我们使用 cfsetospeed 和 cfsetispeed 函数将波特率设置为9600,分别用于设置输出和输入的波特率;清除 PARENB 标志,以禁用奇偶校验;通过 c_cflag 属性操作标志来清除 CSTOPB 标志,以使用一个停止位;通过清除 CSIZE 标志来清除数据位,并通过 CS8 标志来设置数据位为8位。最后,使用 tcsetattr 函数将修改后的属性设置为串口的当前属性,这里使用了 TCSANOW 标志,表示立即应用这些设置。

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_fd, TCSANOW, &tty) != 0) {
perror("Error from tcsetattr");
return 1;
}

3. 发送数据

这段代码通过向 serial_fd 写入字符串数据 "hello world!\n" 以实现串口数据发送,发送成功将在终端打印数据。

char tx_buffer[] = "hello world!\n";
ssize_t bytes_written = write(serial_fd, tx_buffer, sizeof(tx_buffer));
if (bytes_written < 0) {
perror("Error writing to serial port");
close(serial_fd);
return 1;
}
printf("\rtx_buffer: \n %s ", tx_buffer);

4. 接收数据

这段代码通过从 serial_fd 读取数据以实现串口数据接收,接收成功将在终端打印数据。

char rx_buffer[256];
int bytes_read = read(serial_fd, rx_buffer, sizeof(rx_buffer));
if (bytes_read > 0) {
rx_buffer[bytes_read] = '\0';
printf("\rrx_buffer: \n %s ", rx_buffer);
} else {
printf("No data received.\n");
}

5. 交叉编译

使用交叉编译工具编译程序

arm-rockchip830-linux-uclibcgnueabihf-gcc uart.c -o uart

交叉编译成功后,将在当前目录下生成可在开发板运行的可执行文件

# ls

uart uart.c

6. 运行程序

  1. 文件传输

先将 uart 从虚拟机传输到 Windows,再通过 TFTP 或 ADB 传输到开发板,将文件从 Windows 通过 ADB 将文件传输到开发板的步骤如下:

adb push 文件所在路径 开发板存储路径


eg:(将当前目录下uart文件传输到开发板的根目录)

adb push uart /

  1. 运行程序

修改 uart 文件的操作权限后运行程序

# chmod 777 uart

# ./uart

  1. 实验现象

将UART3的TX与RX相接,运行程序,选择UART3进行通信:

在主机环境中编译,在开发板上执行。

阅读记录0
点赞0
收藏0
禁止 本文未经作者允许授权,禁止转载
猜你喜欢
评论/提问(已发布 0 条)
评论 评论
收藏 收藏
分享 分享
pdf下载 下载