OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3295|回复: 0

STM32DMA实现RS485通信,发送数据第一个数据接收不到

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2019-7-7
在线时间
4 小时
发表于 2019-7-7 21:47:08 | 显示全部楼层 |阅读模式
诸位大佬,我想通过DMA实现RS485接收-发送数据,但是遇到了点问题,问题描述如下。
目标:上位机发送10个数,触发接收DMA中断(我用的是UART_IT_IDLE中断),接收中断里用DMA把定义好的18个数发送出去。
实现:
   中断使能:
               __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);          //使能IDLE中断
        __HAL_UART_ENABLE_IT(&huart1, UART_IT_TC);//使能发送完成中断
    打开接收中断:       
       HAL_UART_Receive_DMA(&huart1,RxData,RX_DMA_LEN);
    接收中断服务函数:
        void DMA2_Channel7_IRQHandler(void)
      {
        HAL_DMA_IRQHandler(&hdma_usart1_rx);
        __HAL_UART_CLEAR_IDLEFLAG(&huart1);
        HAL_UART_GetState(&huart1);
        __HAL_UART_CLEAR_FLAG(&huart1,UART_FLAG_TXE);
        HAL_UART_Transmit_DMA(&huart1,TxData,TX_DMA_LEN);//发送数据
        HAL_UART_Receive_DMA(&huart1,RxData,RX_DMA_LEN);       
      }
发送中断服务函数:
     void DMA2_Channel6_IRQHandler(void)
     {
       HAL_DMA_IRQHandler(&hdma_usart1_tx);
       huart1.gState = HAL_UART_STATE_READY;
     }
结果:
微信图片_20190707214521.png
如上图所示,现在每次只有复位以后第一次发送的数据是对的(第一行数据),第二次发送数据就出现第一个字节丢失的情况(第二行数据);
但是如果单纯在while循环里跑串口DMA发送,结果就是正确的。

网上各种方法都试过了,还是不行,现在很迷啊!
各位大佬有没有什么高招,萌新谢过了!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-15 07:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表