Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
DMA
串口
20
4.1.0 hal库版本,dma接收数据断开
发布于 2022-07-25 16:57:28 浏览:834
订阅该版
stm32f407,串口3DMA接收,现象:正常接收数据,数据有校验,数据长度是0xA6(不定长数据,这个是我数的) 接收到的数据是 ![screenshot_图片.png](https://oss-club.rt-thread.org/uploads/20220725/8777d2526b353a25423534d530309ae0.png.webp) 发现进入两次中断,进入这个函数 ```c static void uart_isr(struct rt_serial_device *serial) { struct stm32_uart *uart; #ifdef RT_SERIAL_USING_DMA rt_size_t recv_total_index, recv_len; rt_base_t level; #endif RT_ASSERT(serial != RT_NULL); uart = rt_container_of(serial, struct stm32_uart, serial); /* UART in mode Receiver -------------------------------------------------*/ if ((__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_RXNE) != RESET) && (__HAL_UART_GET_IT_SOURCE(&(uart->handle), UART_IT_RXNE) != RESET)) { rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND); } #ifdef RT_SERIAL_USING_DMA else if ((uart->uart_dma_flag) && (__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_IDLE) != RESET) && (__HAL_UART_GET_IT_SOURCE(&(uart->handle), UART_IT_IDLE) != RESET)) { level = rt_hw_interrupt_disable(); recv_total_index = serial->config.bufsz - __HAL_DMA_GET_COUNTER(&(uart->dma_rx.handle)); recv_len = recv_total_index - uart->dma_rx.last_index; uart->dma_rx.last_index = recv_total_index; rt_hw_interrupt_enable(level); if (recv_len) { rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_DMADONE | (recv_len << 8)); } __HAL_UART_CLEAR_IDLEFLAG(&uart->handle); } ``` 接收到的数据如下,上面是crc,下面是数量 F3 04 F7 F3 03 F6 F6 00 F6 F3 03 F6 F3 03 F6 A9 4D F6 26 80 A6 1C 8A A6 8D 19 A6 40 66 A6 40 66 A6 07 9F A6 相当于A6个数据,接收的时候按照两半接收的,原因是什么,怎么避免呢? 开启串口部分如下,dma缓冲区是6144,很大了: ```c struct serial_configure pconfig; /* 初始化串口 */ if (dev == RT_NULL) { dev = rt_device_find(ENV_NAME); RT_ASSERT(dev); pconfig.baud_rate = BAUD_RATE_9600; pconfig.data_bits = DATA_BITS_8; pconfig.stop_bits = STOP_BITS_1; pconfig.parity = PARITY_NONE; pconfig.bit_order = BIT_ORDER_LSB; pconfig.invert = NRZ_NORMAL; pconfig.bufsz = 6144; pconfig.reserved = 0; /* 设置串口参数 */ rt_device_control(dev, RT_DEVICE_CTRL_CONFIG, &pconfig); /*设置串口的回调函数 */ rt_device_set_rx_indicate(dev, env_recv_ind); } if(RT_EOK ==rt_device_open(dev, RT_DEVICE_FLAG_DMA_RX)) { // rt_kprintf("Screen serial open success.\r\n"); // return RT_EOK; } else { // rt_kprintf("Screen serial open failure.\r\n"); // return RT_ERROR; } ``` 接收部分如下,USART3_RX_BUF是5000,也够大了。: ```c if ((rt_sem_take(&env_rx, 5000)) != RT_EOK) { continue; } recv_num = rt_device_read(dev,0,recv_str,5000); memcpy(USART3_RX_BUF,recv_str,recv_num); if (SEND_MODE == 1) { for(rt_uint8_t i=0;i<(recv_num-2);i++) { crc+=USART3_RX_BUF[i]; } if((crc==USART3_RX_BUF[recv_num-1])&&(USART3_RX_BUF[0]>=1)&&(USART3_RX_BUF[0]<=24)&&(COMM_addr3==USART3_RX_BUF[0])) { if(USART3_RX_BUF[1]==0x03) { if(COMM_addr3!=USART3_RX_BUF[0])break; if(USART3_RX_BUF[2]!=0x00)break; if(USART3_RX_BUF[3]!=0xa0)break; // addr=COMM_SN-1; COMM_OK[COMM_addr3]=1;//这里是控制实时数据页面显示绿色 红色 灰色 for(rt_uint8_t i=0;i<160;i++) { SSSJ.uc[COMM_addr3][i]=USART3_RX_BUF[4+i]; } realtime_data_recv = 1; } } crc = 0; } ``` 多谢。在论坛里搜了一下,去掉了dma函数的注释,但是我的代码根本不会跑到那里,所以没用。 我只能用串口中断接收吗?
查看更多
1
个回答
默认排序
按发布时间排序
出出啊
2022-07-25
恃人不如自恃,人之为己者不如己之自为也
https://club.rt-thread.org/ask/article/bf21ccfb437e1c5d.html https://club.rt-thread.org/ask/article/bfd92159ba11aef6.html https://club.rt-thread.org/ask/article/0ee3da5b6a9c347d.html
撰写答案
登录
注册新账号
关注者
0
被浏览
834
关于作者
伊森亨特
这家伙很懒,什么也没写!
提问
77
回答
31
被采纳
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
ulog 日志 LOG_HEX 输出时间改为本地日期时间
2
在RT-Thread Studio中构建前执行python命令
3
研究一了一段时间RTT,直接标准版上手太难,想用nano,但又舍不得组件
4
CherryUSB开发笔记(一):FSDEV USB IP核的 HID Remote WakeUp (USB HID 远程唤醒) 2025-01-18 V1.1
5
RT-thread 缩写字典
热门标签
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
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
踩姑娘的小蘑菇
1
个答案
2
次被采纳
用户名由3_15位
7
个答案
1
次被采纳
bernard
4
个答案
1
次被采纳
xusiwei1236
4
个答案
1
次被采纳
张世争
1
个答案
1
次被采纳
本月文章贡献
聚散无由
2
篇文章
15
次点赞
catcatbing
2
篇文章
5
次点赞
Wade
2
篇文章
2
次点赞
Ghost_Girls
1
篇文章
6
次点赞
YZRD
1
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部