debug工具没法接收到gps接的usart2发送的数据

发布于 2020-07-18 17:34:04

/*

  • 程 序 清 单: 这 是 一 个 串 口 设 备 使 用 例 程
  • 例 程 导 出 了 uart_sample 命 令 到 控 制 终 端
  • 命 令 调 用 格 式:uart_sample uart2
  • 命 令 解 释: 命 令 第 二 个 参 数 是 要 使 用 的 串 口 设 备 名 称, 为 空 则 使 用 默 认 的 串 口 设 备
  • 程 序 功 能: 通 过 串 口 输 出 字 符 串"hello RT-Thread!", 然 后 错 位 输 出 输 入 的 字 符

*/

include <rtthread.h>

define HUARTNAME2 "uart2"

define HUARTNAME1 "uart1"

/ 用 于 接 收 消 息 的 信 号 量 /
static struct rt_semaphore rx_sem;
static rt_device_t serial2;
static rt_device_t serial1;
/ 接 收 数 据 回 调 函 数 /
static rt_err_t uart_input(rt_device_t dev, rt_size_t size)
{

/* 串 口 接 收 到 数 据 后 产 生 中 断, 调 用 此 回 调 函 数, 然 后 发 送 接 收 信 号 量 */
rt_sem_release(&rx_sem);

return RT_EOK;

}

static void serial_thread_entry(void *parameter)
{

char ch;

while (1)
{
    /* 从 串 口 读 取 一 个 字 节 的 数 据, 没 有 读 取 到 则 等 待 接 收 信 号 量 */
    while (rt_device_read(serial2, -1, &ch, 1) != 1)
    {
        /* 阻 塞 等 待 接 收 信 号 量, 等 到 信 号 量 后 再 次 读 取 数 据 */
        rt_sem_take(&rx_sem, RT_WAITING_FOREVER);

    }
    /* 读 取 到 的 数 据 通 过 串 口 错 位 输 出 */
    ch = ch;
    rt_device_write(serial2, -1, &ch, 1);
    printf("%c",ch);

}

}

static int uart_sample(int argc, char *argv[])
{

rt_err_t ret = RT_EOK;
char uart2_name[RT_NAME_MAX];
char uart1_name[RT_NAME_MAX];
char str[] = "hello RT-Thread!\r\n";

if (argc == 2)
{
    rt_strncpy(uart2_name, argv[1], RT_NAME_MAX);
    rt_strncpy(uart1_name, argv[1], RT_NAME_MAX);
}
else
{
    rt_strncpy(uart2_name, HUARTNAME2, RT_NAME_MAX);
    rt_strncpy(uart1_name, HUARTNAME1, RT_NAME_MAX);
}

/* 查 找 系 统 中 的 串 口 设 备 */
serial2 = rt_device_find(uart2_name);
serial1 = rt_device_find(uart1_name);
if (!serial2)
{
    rt_kprintf("find %s failed!\n", uart2_name);
    return RT_ERROR;
}
if (!serial1)
    {
        rt_kprintf("find %s failed!\n", uart1_name);
        return RT_ERROR;
    }

/* 初 始 化 信 号 量 */
rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO);
/* 以 中 断 接 收 及 轮 询 发 送 模 式 打 开 串 口 设 备 */
rt_device_open(serial2, RT_DEVICE_FLAG_INT_RX);
rt_device_open(serial1, RT_DEVICE_FLAG_INT_RX);
/* 设 置 接 收 回 调 函 数 */
rt_device_set_rx_indicate(serial2, uart_input);
/* 发 送 字 符 串 */
rt_device_write(serial2, 0, str, (sizeof(str)));
rt_device_write(serial1, 0, str, (sizeof(str)));
/* 创 建 serial 线 程 */
rt_thread_t thread = rt_thread_create("serial", serial_thread_entry, RT_NULL, 1024, 25, 10);
/* 创 建 成 功 则 启 动 线 程 */
if (thread != RT_NULL)
{
    rt_thread_startup(thread);
}
else
{
    ret = RT_ERROR;
}

return ret;

}
/ 导 出 到 msh 命 令 列 表 中 /
MSH_CMD_EXPORT(uart_sample, uart device sample);
int main(int argc,char *argv[]){

uart_sample(argc, argv);
return RT_EOK;

}

查看更多

关注者
0
被浏览
179
3 个回答
JQRR_7669
JQRR_7669 认证专家 2020-07-18

shell也是使用的uart2吧?和你例程的串口冲突了吧!

luckydarcy
luckydarcy 认证专家 2020-07-18

肯定收不到啦 ( ̄_, ̄ )

首先,你是在 main 函数调用 uart_sample 直接给串口发送数据的。

int main(int argc,char *argv[])
{
    uart_sample(argc, argv);
    return RT_EOK;
}

然后 uart_sample 函数里要初始化串口,又要发送数据。

/* 初 始 化 信 号 量 */
rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO);
/* 以 中 断 接 收 及 轮 询 发 送 模 式 打 开 串 口 设 备 */
rt_device_open(serial2, RT_DEVICE_FLAG_INT_RX);
rt_device_open(serial1, RT_DEVICE_FLAG_INT_RX);
/* 设 置 接 收 回 调 函 数 */
rt_device_set_rx_indicate(serial2, uart_input);
/* 发 送 字 符 串 */
rt_device_write(serial2, 0, str, (sizeof(str)));
rt_device_write(serial1, 0, str, (sizeof(str)));
/* 创 建 serial 线 程 */
rt_thread_t thread = rt_thread_create("serial", serial_thread_entry, RT_NULL, 1024, 25, 10);

问题就在这里呀!你都还没设置好 uart 回调函数,就 open 。。。还没启动串口数据接收线程,就 write 。。。 怎么可能收到数据啊!

所以,解决办法很简单啦,就是调一下顺序呗!

/* 初 始 化 信 号 量 */
rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO);

/* 设 置 接 收 回 调 函 数 */
rt_device_set_rx_indicate(serial2, uart_input);

/* 创 建 serial 线 程 */
rt_thread_t thread = rt_thread_create("serial", serial_thread_entry, RT_NULL, 1024, 25, 10);
/* 创 建 成 功 则 启 动 线 程 */
if (thread != RT_NULL)
{
    rt_thread_startup(thread);
}
else
{
    ret = RT_ERROR;
}

/* 以 中 断 接 收 及 轮 询 发 送 模 式 打 开 串 口 设 备 */
rt_device_open(serial2, RT_DEVICE_FLAG_INT_RX);
rt_device_open(serial1, RT_DEVICE_FLAG_INT_RX);

/* 发 送 字 符 串 */
rt_device_write(serial2, 0, str, (sizeof(str)));
rt_device_write(serial1, 0, str, (sizeof(str)));

另外,你打开两个串口是为了测试是吧?像楼上说的,先确认好串口是不是 uart2,然后改改代码再测试一下吧!应该是可以的!

PS. 建议把串口初始化和 write 操作分开来。

<( ̄︶ ̄)>

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览