Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
DMA
串口
Uart2 被用于Finsh和正常工作端口,如何设置DMA?
发布于 2021-07-28 23:33:32 浏览:1082
订阅该版
我的板子上UART2被用于Finsh,并且它还要在生成环境中做命令端口对外发布命令和接受数据反馈。 在以前的程序中我是使用 串口空闲中断+DMA 来收发数据,现在用RTT后,finsh也基于uart2,我使用下面的代码来测试发现无法实现正常的数据接收 ```c #define UART_2 "uart2" /* 串口设备名称 */ /* 串口接收消息结构*/ struct rx_msg { rt_device_t dev; rt_size_t size; }; /* 串口设备句柄 */ static rt_device_t uart2; /* 消息队列控制块 */ 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] = '\0'; /* 通过串口设备 uart2 输出读取到的消息 */ rt_device_write(uart2, 0, rx_buffer, rx_length); /* 打印数据 */ //rt_kprintf("%s\n", rx_buffer); } } } static int uart_dma_sample(void) { rt_err_t ret = RT_EOK; static char msg_pool[256]; char str[] = "hello uart!\r\n"; /* 查找串口设备 */ uart2 = rt_device_find(UART_2); if (!uart2) { rt_kprintf("find %s failed!\n", "uart2"); return RT_ERROR; } /* 初始化消息队列 */ rt_mq_init(&rx_mq, "rx_mq", msg_pool, /* 存放消息的缓冲区 */ sizeof(struct rx_msg), /* 一条消息的最大长度 */ sizeof(msg_pool), /* 存放消息的缓冲区大小 */ RT_IPC_FLAG_FIFO); /* 如果有多个线程等待,按照先来先得到的方法分配消息 */ /* 以 DMA 接收及轮询发送方式打开串口设备 */ rt_device_open(uart2, RT_DEVICE_FLAG_DMA_RX); /* 设置接收回调函数 */ rt_device_set_rx_indicate(uart2, uart_input); /* 发送字符串 */ rt_device_write(uart2, 0, str, (sizeof(str) - 1)); /* 创建 uart2 线程 */ rt_thread_t thread = rt_thread_create("uart2", serial_thread_entry, RT_NULL, 512, 25, 10); /* 创建成功则启动线程 */ if (thread != RT_NULL) { rt_thread_startup(thread); } else { ret = RT_ERROR; } return ret; } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(uart_dma_sample, uart device dma sample); ``` 现在的效果是:输入任意字符,马上返回该字符。 我想要实现该串口的在正常工作时DMA收发功能,是不是必需把finsh更换到其他串口上?
查看更多
小小李sunny
2021-07-29
这家伙很懒,什么也没写!
建议把控制台换到其他串口吧,因为控制台本身有自己的收发程序,你这里又给这个串口进行了一次初始化,再写了一套收发的程序,两套代码同时执行,而且还是不同的模式,肯定会有问题。
3
个回答
默认排序
按发布时间排序
出出啊
2021-07-29
恃人不如自恃,人之为己者不如己之自为也
finsh_set_console_device?
牧羽子
2021-11-09
这家伙很懒,什么也没写!
楼主如何解决的,我遇到问题和你一样
撰写答案
登录
注册新账号
关注者
0
被浏览
1.1k
关于作者
itdreamworks
求一硬件开发工程师合作
提问
16
回答
9
被采纳
0
关注TA
发私信
相关问题
1
串口DMA发送数据时,数据被覆盖
2
关于串口DMA模式下rt_device_close问题
3
利用stm32f427实现usb转串口,电脑端什么也没有识别到
4
finsh 控制台 适配 RS 485请大神指点????
5
uart_sample.c 中,读串口设备时偏移量pos要设置为-1而不是0?
6
【结贴】at_device软件包中对串口接收数据缺少判断导致数据接收异常
7
串口无法接受数据,但可以发送
8
串口如何有效的清除掉接收缓冲,而不必一个一个的去读取
9
串口接收使用方式问题
10
雅特力FINSH问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
rt-smart启动流程分析
2
EtherKit快速上手PROFINET
3
RTThread USB转串口无法接收数据
4
HC32F4A0 SD卡挂载及热插拔的实现
5
vscode插件 - RT-Thread Studio项目助手 | 跨平台开发
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
cubemx
PWM
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
812
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
1
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部