完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
这个问题论坛里很多问的,我也看了看,网上也搜了搜,感觉还是需要讨论下
请教下各位,在RT-Thread 标准版里,如何实现,像上面伪代码那样的空闲中断?使用DMA和不使用DMA,实现起来是否一样? 我看了文档里《串口设备使用示例》,没有用到空闲中断。在serial_thread_entry里面添加一个空闲标志位判断,会影响RTT驱动框架吗?如下更改:
不使用空闲中断,是不是因为,有些MCU没有空闲中断?为了保证兼容性? |
|
相关推荐
13个回答
|
|
可以使用rs485软件包实现不定长帧接收,设置适当的字节超时时间,就可自动分帧。
|
|
|
|
开个定时器判断字节间隔时间,太不好用了。。。为啥有空闲中断不用
|
|
|
|
为什么不用硬件空闲中断分帧,因为时间太短且不可调,用于协议分帧不实用。
|
|
|
|
同意,空闲中断可以用于优化驱动,但建议用来做应用协议超时。
|
|
|
|
可以看看这段代码,DMA+IDLE接收串口数据 /* * 程序清单:这是一个串口设备 DMA 接收使用例程 * 例程导出了 uart_dma_sample 命令到控制终端 * 命令调用格式:uart_dma_sample uart3 * 命令解释:命令第二个参数是要使用的串口设备名称,为空则使用默认的串口设备 * 程序功能:通过串口输出字符串"hello RT-Thread!",并通过串口输出接收到的数据,然后打印接收到的数据。 */ #include #define SAMPLE_UART_NAME "uart3" /* 串口设备名称 */ /* 串口接收消息结构*/ struct rx_msg { rt_device_t dev; rt_size_t size; }; /* 串口设备句柄 */ static rt_device_t serial; /* 消息队列控制块 */ static struct rt_messagequeue rx_mq; /* 接收数据回调函数 */ static rt_err_t uart_input(rt_device_t dev, rt_size_t size) { struct rx_msg msg; rt_err_t result; msg.dev = dev; msg.size = size; result = rt_mq_send(&rx_mq, &msg, sizeof(msg)); if ( result == -RT_EFULL) { /* 消息队列满 */ rt_kprintf("message queue full!n"); } return result; } static void serial_thread_entry(void *parameter) { struct rx_msg msg; rt_err_t result; rt_uint32_t rx_length; static char rx_buffer[RT_SERIAL_RB_BUFSZ + 1]; while (1) { rt_memset(&msg, 0, sizeof(msg)); /* 从消息队列中读取消息*/ result = rt_mq_recv(&rx_mq, &msg, sizeof(msg), RT_WAITING_FOREVER); if (result == RT_EOK) { /* 从串口读取数据*/ rx_length = rt_device_read(msg.dev, 0, rx_buffer, msg.size); rx_buffer[rx_length] = ' |