Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
UART
CPU STM32F103RCT6 串口DMA接收问题
发布于 2019-06-06 09:59:09 浏览:1943
订阅该版
CPU STM32F103RCT6 串口DMA接收感觉有点问题,根据UART设备驱动介绍,“一般情况下 DMA 接收模式会结合 DMA 接收完成中断和串口空闲中断完成数据接收”,我通过串口工具发送字节短一点的数据,这里我发送了4个字节,程序进入接收回调,一次性接收完成,但是我发送长一点的字节,这里发送的是56个字节,从调试情况来看大部分要分两次才能接收完成。这应该是不对的,应该要等到56个字节全部接收完成才会有串口空闲中断哦。这种情况对于不定长的数据时很麻烦的。不知道是不是我的代码设置那里有问题才导致,请大侠帮忙看看,谢谢。 附代码: /* 接收数据回调函数 */ static rt_err_t host_uart_input(rt_device_t dev, rt_size_t size) { struct host_uart_rx_msg msg; rt_err_t ret; msg.dev = dev; msg.size = size; rt_kprintf("rece host data %d
",size); ret = rt_mq_send(&host_uart_rx_mq, &msg, sizeof(msg)); if ( ret == -RT_EFULL) { /* 消息队列满 */ rt_kprintf("message queue full!
"); } return ret; } void hostuart_thread_entry(void *parameter) { struct host_uart_rx_msg msg; rt_err_t ret; rt_uint32_t rx_length; while(1) { rt_memset(&msg, 0, sizeof(msg)); /* 从消息队列中读取消息*/ ret = rt_mq_recv(&host_uart_rx_mq, &msg, sizeof(msg), RT_WAITING_FOREVER); if (ret == RT_EOK) { /* 从串口读取数据*/ rx_length = rt_device_read(msg.dev, 0, g_HostUartRBuff, msg.size); g_HostUartRBuff[rx_length] = '\0'; /* 通过串口设备 serial 输出读取到的消息 */ //rt_device_write(hostuart_dev, 0, g_HostUartRBuff, rx_length); /* 打印数据 */ //rt_kprintf("%s
",g_HostUartRBuff); HostUartReceProc(); } } } rt_err_t host_uart_app_init(void) { rt_err_t ret**;** static char msg_pool[256**;** char str[] = "host uart
"**;** rt_pin_mode(HOST_LED_OUTPUT_PIN, PIN_MODE_OUTPUT)**;** InitDeviceParameter()**;** hostuart_dev = rt_device_find(HOST_UART_NAME)**;** if(!hostuart_dev) { rt_kprintf("find %s failed!
", HOST_UART_NAME)**;** return RT_ERROR**;** } /* 初始化消息队列 */ rt_mq_init(&host_uart_rx_mq, "host_uart_rx_mq", msg_pool, /* 存放消息的缓冲区 */ sizeof(struct host_uart_rx_msg), /* 一条消息的最大长度 */ sizeof(msg_pool), /* 存放消息的缓冲区大小 */ RT_IPC_FLAG_FIFO)**;** /* 如果有多个线程等待,按照先来先得到的方法分配消息 */ /* 以 DMA 接收及发送方式打开串口设备 */ ret = rt_device_open(hostuart_dev, RT_DEVICE_FLAG_DMA_RX)**;** config.baud_rate = BAUD_RATE_115200**;** config.data_bits = DATA_BITS_8**;** config.stop_bits = STOP_BITS_1**;** config.parity = PARITY_NONE**;** /* 打开设备后才可修改串口配置参数 */ ret = rt_device_control(hostuart_dev, RT_DEVICE_CTRL_CONFIG, &config)**;** /* 设置接收回调函数 */ ret = rt_device_set_rx_indicate(hostuart_dev, host_uart_input)**;** /* 发送字符串 */ ret = rt_device_write(hostuart_dev, 0, str, (sizeof(str) - 1))**;** rt_thread_t tid = rt_thread_create("hostuart", hostuart_thread_entry, RT_NULL, HOST_UART_APP_STKSIZE, HOST_UART_APP_PRIO, 20)**;** if (tid == RT_NULL) { return RT_ERROR**;** } rt_thread_startup(tid)**;** return RT_EOK**;**
查看更多
4
个回答
默认排序
按发布时间排序
zhangjun
2019-06-06
这家伙很懒,什么也没写!
1.如文档所说 DMA 接收完成中断和串口空闲中断共同作用完成数据接收,所以猜测4字节接收应该是4字节小于dma接收长度触发了串口空闲中断,而56字节应该是触发了一次dma接收中断和一次串口接收中断。 2,之所以出现1中的现象,应该因为串口缓冲区长度被设置得大于4小于56. 3,结合你贴出来的代码,你在调用rt_device_control配置串口时,并没有初始化config参数里面的bufsz成员,这个成员可能是一个随机值
ddk2006
2019-06-06
这家伙很懒,什么也没写!
[i=s] 本帖最后由 ddk2006 于 2019-6-6 17:38 编辑 [/i] 谢谢zhangjun 的回复,我把RT_SERIAL_RB_BUFSZ改成128后发现发送的总字节超过128后还是会拆包哦,是不是要像论坛里面所说屏蔽屏蔽DMA溢出中断哦?还是说哦每次接收完成可以清空FIFO?RT thread不会犯这样的错误吧?
zhangjun
2019-06-06
这家伙很懒,什么也没写!
>谢谢zhangjun 的回复,我把RT_SERIAL_RB_BUFSZ改成128后发现发送的总字节超过128后还是会拆包哦,是不是要 ... --- 1,RT_SERIAL_RB_BUFSZ你默认值,在第一次打开设备时被应用到设备上 2,但是你在调用rt_device_control配置串口时,并没有初始化config参数里面的bufsz成员,这个成员可能是一个随机值,是这里可能把缓冲区改小了。
tyustli
2019-06-19
这家伙很懒,什么也没写!
1、串口 DMA 中断会有串口空闲中断、DMA 半满中断 DMA 满中断 2、发送 4 个字节触发串口空闲中断 3、发送 56 个字节第一次会触发半满中断和空闲中断,第二次会触发空闲中断 4、发送多字节时也是按照这个规律触发中断
撰写答案
登录
注册新账号
关注者
0
被浏览
1.9k
关于作者
ddk2006
这家伙很懒,什么也没写!
提问
10
回答
21
被采纳
0
关注TA
发私信
相关问题
1
rt thread 2.0.2 usart 接收缓存问题
2
关于STM32串口通信的问题
3
STM32F1+RTT串口接收终端数据丢失问题
4
UART TX丢数据?
5
RTT打开串口的时候如何自定义波特率呢?
6
STM32F4的USART数据接收问题
7
串口1234使用问题
8
串口接收回调函数
9
LPC18xx UART问题讨论
10
x1000串口配置的失败问题
推荐文章
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
使用RC522软件包驱动FM1722
2
常量数据类型和表达式陷阱分享
3
进行i2c驱动移植的经验总结
4
在VSCode中使用clang-format
5
我该如何使用这个微雪的WIFI400 WIFI-LPB-100在rtt里或者我该怎样为它开发驱动
热门标签
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在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
289
次被采纳
张世争
809
个答案
175
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
YZRD
1
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部