nuttx实战项目:多路串口合并功能之五串口功能测试

NuttX五串口功能测试与问题分析

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 复用寄存器配置。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值