你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32H743VIT6 HAL 串口DMA发送掉帧

[复制链接]
菜菜的洋芋头 提问时间:2025-3-10 17:04 / 已解决

因为程序耗时大概10ms(已用HAL_Delay代替)左右会生成两组大小1104的数据 波特率1250000 使用两路串口DMA发送 485芯片(只发送 485使能引脚不会改变)等外围电路满足要求(只接收的情况 同平台已经测试过串口DMA循环模式 并把数据保存至SD卡 数据无异常) 但是在实际运行中会出现数据错误情况。 剔除多余代码,生成两组数据 while中循环发送 延时10ms 1741597358175.jpg

发现数据出现掉帧情况1741596893109.png

以为两路数据需要互相等待没发送完成 但是使用示波器测试发现两组数据基本是同时发出,并且在10ms内已经发送完成 请问代码中是否存在问题,谢谢image.png

image.png
%2A}S$M0MS0T)1%X8]I9@22.png
1741598565506.png
收藏 评论10 发布时间:2025-3-10 17:04

举报

10个回答
菜菜的洋芋头 最优答案 回答时间:2025-3-11 16:37:37

butterflyspring 发表于 2025-3-11 15:58
理论上8ms 多就发送完了,从波形上看也是这样。</p>
<p>

谢谢 我排查了一下 应该是不能同一台电脑接收(换其他品牌电脑试了) 用两台电脑分别接收就好了(除了第一包数据错误) 很奇怪的问题

butterflyspring 回答时间:2025-3-11 15:58:23
闲尘 发表于 2025-3-11 07:58
[md]你好  是已经发出来的而且能循环发送  测量只是为了确定是不是能在10ms内发完(因为发现要延时25ms数 ...

理论上8ms 多就发送完了,从波形上看也是这样。


与25ms 延时相差太多太多了。

会不会瓶颈在接收的方式上了?

考虑换个方式测量发送的数量看看。
xmshao 回答时间:2025-3-11 08:46:01
想跟你确认下,你目前的测试代码中的DMA传输是工作在Normal模式还是circular模式?


如果是normal模式,且保证延时时间内传输能完成的话,就不该有什么问题。


如果circular模式的话,那个延时时间可能不太好设置,不管怎么配置,终究


都会出现丢帧的情况。 不过从你代码来看,不像使用循环模式,因为循环模式


不用反复启动。


所以,你如果使用的是Normal模式还丢帧的话,或许看看别的方面的原因。
菜菜的洋芋头 回答时间:2025-3-10 17:26:51

主程序如下

int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MPU Configuration--------------------------------------------------------*/
  MPU_Config();

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_UART5_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
    IQ_40[0] = 0x40;
    IQ_40[1] = 0xFC;
    IQ_40[2] = 0x00;
    IQ_40[3] = 0xFF;
    IQ_40[4] = 0x37;
    IQ_40[5] = 0x61;
    IQ_40[6] = 0x00;
    IQ_40[7] = 0x00;
    IQ_40[8] = 0x01;
    IQ_40[9] = 0x01;
    IQ_40[10] = (IQ_count>>24)&0xff;
    IQ_40[11] = (IQ_count>>16)&0xff;
    IQ_40[12] = (IQ_count>>8)&0xff;
    IQ_40[13] = IQ_count&0xff;
    IQ_40[14] = 0xFF;
    IQ_40[15] = 0xFF;
    for(i=0;i<=1080;i+=8)
    {
        IQ_40[16+i]=j;
        IQ_40[17+i]=j;
        IQ_40[18+i]=j;
        IQ_40[19+i]=j;
        IQ_40[20+i]=j;
        IQ_40[21+i]=j;
        IQ_40[22+i]=j;
        IQ_40[23+i]=j;
        j++;
    }

    IQ_50[0] = 0x50;
    IQ_50[1] = 0xFC;
    IQ_50[2] = 0x00;
    IQ_50[3] = 0xFF;
    IQ_50[4] = 0x37;
    IQ_50[5] = 0x61;
    IQ_50[6] = 0x00;
    IQ_50[7] = 0x00;
    IQ_50[8] = 0x01;
    IQ_50[9] = 0x01;
    IQ_50[10] = (IQ_count>>24)&0xff;
    IQ_50[11] = (IQ_count>>16)&0xff;
    IQ_50[12] = (IQ_count>>8)&0xff;
    IQ_50[13] = IQ_count&0xff;
    IQ_50[14] = 0xFF;
    IQ_50[15] = 0xFF;
    j=0;
    for(i=0;i<=1080;i+=8)
    {
        IQ_50[16+i]=j;
        IQ_50[17+i]=j;
        IQ_50[18+i]=j;
        IQ_50[19+i]=j;
        IQ_50[20+i]=j;
        IQ_50[21+i]=j;
        IQ_50[22+i]=j;
        IQ_50[23+i]=j;
        j++;
    }
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
        IQ_40[10] = (IQ_count>>24)&0xff;
        IQ_40[11] = (IQ_count>>16)&0xff;
        IQ_40[12] = (IQ_count>>8)&0xff;
        IQ_40[13] = IQ_count&0xff;

        IQ_50[10] = (IQ_count>>24)&0xff;
        IQ_50[11] = (IQ_count>>16)&0xff;
        IQ_50[12] = (IQ_count>>8)&0xff;
        IQ_50[13] = IQ_count&0xff;

        HAL_GPIO_WritePin(RUN_GPIO_Port, RUN_Pin, GPIO_PIN_RESET);
        HAL_UART_Transmit_DMA(&huart5, (uint8_t *)IQ_40, 1104);

//      HAL_GPIO_WritePin(RUN_GPIO_Port, RUN_Pin, GPIO_PIN_SET);
        HAL_UART_Transmit_DMA(&huart1, (uint8_t *)IQ_50, 1104);
        HAL_Delay(22);
        IQ_count++;
  }
  /* USER CODE END 3 */
}
butterflyspring 回答时间:2025-3-10 17:44:55
上图波形是串口TX的么?


如果是,那不是已经发出来了么,看看波特率再调整一下看看是否是期望的。

另外从幅度看,似乎测量的效果不佳。
菜菜的洋芋头 回答时间:2025-3-11 07:58:32

butterflyspring 发表于 2025-3-10 17:44
上图波形是串口TX的么?</p>
<p>

你好 是已经发出来的而且能循环发送 测量只是为了确定是不是能在10ms内发完(因为发现要延时25ms数据才正确 但是这样就失去了DMA的意义) 但是实际电脑接收到的数据出现了掉帧(不是乱码)

菜菜的洋芋头 回答时间:2025-3-11 13:57:20

xmshao 发表于 2025-3-11 08:46
想跟你确认下,你目前的测试代码中的DMA传输是工作在Normal模式还是circular模式?</p>
<p>

你好 发送我使用的是normal模式 测试只用一个串口发送的话 延时10ms发送的数据正常未出现掉帧 但是用两个串口发送就会都出现问题 理论上两个DMA不应该是独立的吗(使用DMA1 不同数据流 和分别使用DMA1和DMA2都试过)

xmshao 回答时间:2025-3-11 15:16:01
嗯,首先这里的DMA通道及传输的确是独立的,但是他们共用同一总线矩阵,一个跑和两个同时跑可能存在差别。


你现在用到UART1 和 UART5, 你将内存区分开测试下,比方一个使用SRAM1,一个使用SRAM2。
菜菜的洋芋头 回答时间:2025-3-11 16:35:08

xmshao 发表于 2025-3-11 08:46
想跟你确认下,你目前的测试代码中的DMA传输是工作在Normal模式还是circular模式?</p>
<p>

谢谢 我排查了一下(换了好几个串口助手UartAssist、sscom都试了)最后发现两个串口都发送但是电脑只接收一个串口的数据问题就小很多 换两台电脑分开接收就可以了(除了第一包数据出现问题) 不能同一台电脑收……神奇的问题 1741681635519.png

xmshao 回答时间:2025-3-12 09:05:42

闲尘 发表于 2025-3-11 16:35
谢谢    我排查了一下(换了好几个串口助手UartAssist、sscom都试了)最后发现两个串口都发送但是电 ...

[md]嗯。

如果你发送端使用DMA Normal模式,发送端没有啥问题。看来问题出在PC端接收处理能力,或许你可在UART通信中加上流控。

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版