NuttX 串口 2-6 测试与验证
在这一篇中,我们针对目前需要用到的串口 2–6 进行测试,用来确认系统底层是否已经正确配置。
由于 NuttX 项目框架还不是很完善,所以并不是“打开某个宏,功能就一定可用”,因此必须进行一些实际测试。
第一步:准备测试程序
我向 OpenAI 描述了需求如下:
我们的 NuttX 有如下串口节点:
nsh> ls /dev console null ttyS0 ttyS1 ttyS2 ttyS3 ttyS4 ttyS5 zero我想写的串口程序是这样的:
当我执行:
yumo_intelligence /dev/ttyS2程序会打开
S2串口,并且开启一个线程每隔 1 秒发送字符串:hello, yumo intelligence!\r\n同时主线程负责接收串口数据并打印到控制台,串口参数为 115200, 8N1。
OpenAI 给出的示例程序如下:
#include <nuttx/config.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
#include <pthread.h>
#include <string.h>
/* 串口文件描述符,全局变量 */
static int g_fd = -1;
/* 发送线程 */
static void *sender_thread(void *arg)
{
const char *msg = "hello, yumo intelligence!\r\n";
while (1)
{
write(g_fd, msg, strlen(msg));
fsync(g_fd); /* 确保立即发送 */
sleep(1);
}
return NULL;
}
int main(int argc, FAR char *argv[])
{
struct termios tio;
pthread_t tid;
char buf[128];
ssize_t n;
if (argc < 2)
{
fprintf(stderr, "Usage: %s <serial_device>\n", argv[0]);
return -1;
}
/* 打开串口设备 */
g_fd = open(argv[1], O_RDWR | O_NOCTTY);
if (g_fd < 0)
{
perror("open serial");
return -1;
}
/* 获取当前配置 */
tcgetattr(g_fd, &tio);
/* 设置为原始模式 */
cfmakeraw(&tio);
/* 设置波特率 115200 */
cfsetispeed(&tio, B115200);
cfsetospeed(&tio, B115200);
/* 8N1 配置 */
tio.c_cflag &= ~PARENB; /* 无校验 */
tio.c_cflag &= ~CSTOPB; /* 1 位停止位 */
tio.c_cflag &= ~CSIZE;
tio.c_cflag |= CS8; /* 8 位数据 */
/* 应用配置 */
tcsetattr(g_fd, TCSANOW, &tio);
/* 创建发送线程 */
if (pthread_create(&tid, NULL, sender_thread, NULL) != 0)
{
perror("pthread_create");
close(g_fd);
return -1;
}
/* 主线程循环接收并打印 */
while (1)
{
n = read(g_fd, buf, sizeof(buf)-1);
if (n > 0)
{
buf[n] = '\0';
printf("[RECV] %s", buf);
fflush(stdout);
}
}
close(g_fd);
return 0;
}
第二步:测试结果
我们依次测试了以下串口引脚:
- S1:PA2, PA3
- S2:PB10, PB11
- S3:PA1(RX)
- S4:PC12, PD2
- S5:PC6, PC7
测试结果表明,大部分串口在 NuttX 端都能正常收发数据。
遇到的问题
目前只剩下 S3 的 TX 出现了问题。
根据电路图,S3 的 TX 对应 PC10,但是在测试中发现无法正常发送。
推测 PC10 可能被配置成了其他复用功能,而不是 USART3_TX。
这个问题会在下一篇文章中展开,分析 PC10 的 GPIO 复用寄存器配置。
NuttX五串口功能测试与问题分析
397

被折叠的 条评论
为什么被折叠?



