嵌入式技术william hill官网
直播中

贾大林

7年用户 1303经验值
私信 关注
[问答]

rt_device_read()为什么接受多个字节的时候接收不到呢

这是我修改的示例代码,为什么接受多个字节的时候接收不到呢???求助

#include <rtthread.h>

#define SAMPLE_UART_NAME "uart2"

char counter = 0;

/* 用于接收消息的信号量 */

//static struct rt_semaphore rx_sem;

static rt_device_t serial;

/* 接收数据回调函数 */

static rt_err_t uart_input(rt_device_t dev, rt_size_t size)

{

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

// rt_sem_release(&rx_sem);

counter++;

return RT_EOK;

}

static void serial_thread_entry(void *parameter)

{

char ch[2];

while (1)

{

    /* 从串口读取一个字节的数据,没有读取到则等待接收信号量 */

    while (rt_device_read(serial, -1, ch, 2) != 2)

    {

        /* 阻塞等待接收信号量,等到信号量后再次读取数据 */

       // rt_sem_take(&rx_sem, RT_WAITING_FOREVER);

    }

    /* 读取到的数据通过串口错位输出 */

    rt_device_write(serial, 0, ch, 2);

}

}

int uart_sample(int argc)

{

rt_err_t ret = RT_EOK;

char uart_name[RT_NAME_MAX];

// char str[] = "hello RT-Thread!\r\n";

if (argc == 2)

{

    //rt_strncpy(uart_name, argv[1], RT_NAME_MAX);

}

else

{

    rt_strncpy(uart_name, SAMPLE_UART_NAME, RT_NAME_MAX);

}

/* 查找系统中的串口设备 */

serial = rt_device_find(uart_name);

if (!serial)

{

    rt_kprintf("find %s failed!\n", uart_name);

    return RT_ERROR;

}

/* 初始化信号量 */

// rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO);

/* 以中断接收及轮询发送模式打开串口设备 */

rt_device_open(serial, RT_DEVICE_FLAG_INT_RX);

/* 设置接收回调函数 */

rt_device_set_rx_indicate(serial, uart_input);

/* 发送字符串 */

//rt_device_write(serial, 0, str, (sizeof(str) - 1));

/* 创建 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;

}

回帖(6)

陈伟

2022-8-4 10:22:27
rt_device_read(serial, -1, ch, 2) != 2
看看官方例程
举报

张秀兰

2022-8-4 10:22:35
大佬,你把
rt_sem_release
rt_sem_take
那两行注释掉了,线程相当于在死循环哦。
你想接收多个自己可以把
uint8_t read_buffer[64];
int read_len = rt_device_read(serial, -1, read_buffer, 64);
举报

王斌

2022-8-4 10:22:44
字节流设备,又不是数据块设备,谁保证你想要多少数据就立马给你多少数据?
举报

陈勇

2022-8-4 10:22:51
rt_sem_release(&rx_sem);
rt_sem_take(&rx_sem, RT_WAITING_FOREVER);
这为啥都注释掉啊,注释掉当然收不到了啊。可以看看文档中心的例程这些是啥意思。
举报

王霞

2022-8-4 10:23:02
受到警告
提示: 作者被禁止或删除 内容自动屏蔽
举报

王霞

2022-8-4 10:23:07
受到警告
提示: 作者被禁止或删除 内容自动屏蔽
举报

更多回帖

发帖
×
20
完善资料,
赚取积分