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

串口空闲中断+DMA。第二次接收长度为0

[复制链接]
叶默12 提问时间:2023-11-8 17:19 / 未解决
赞 收藏 评论5 发布时间:2023-11-8 17:19

举报

5个回答
xmshao 回答时间:2023-11-8 17:34:27
基本锁定代码方面问题,就这么一句话,旁人只有浓浓的无力感!
网上不少类似案例分享,稍微比较下。 如果使用ST库的话,
注意你的第二次是否真的发送了,里面有些类似gState状态机
的变量,看看是否在ready状态。
叶默12 回答时间:2023-11-8 17:39:04

HAL库,自定义空闲中断回调,在串口中断服务函数中调用。在其他位置进行发送接收数组(阻塞),这种情况下可以正常接收,包含接收个数第二次也正常。如果使用DMA发送就会导致第二次接收长度为0,接收DMA配置为一般模式,发送DMA循环模式。接收串口在自定义回调函数中重新开启了DMA串口接收。 在测试过程中仅更改了串口发送方式,DMA(非阻塞)和阻塞发送。不理解为什么串口发送影响了串口接收。

HAL_UART_Transmit(&huart3 ,USART3_Struct.rxbuf, 16 , 10);

HAL_UART_Transmit_DMA(&huart3 ,USART3_Struct.rxbuf, 16);

void USR_UART_IdleRxCpltCallback(UART_HandleTypeDef *huart) { if( huart->Instance == USART3) { if ( USART3_Struct.Busyflag == 0 ) { USART3_Struct.usart3_rxbuf_len = rxbuffsize - (__HAL_DMA_GET_COUNTER(&hdma_usart3_rx));//接收个数 if( USART3_Struct.usart3_rxbuf_len != 16 )//判断接收数据长度是否正常,如果异常就回复数据长度错误 { //长度错误 } if(USART3_Struct.usart3_rxbuf_len==16)//数据长度正常,未处于解析命令状态 { //拷贝数组 for(uint8_t i=0; i < USART3_Struct.usart3_rxbuf_len ;i++) { USART3_Struct.rxbuf[i]=USART3_Struct.usart3_rxbuf[i];//将收到的数组放到解析缓存数组里去 } //主函数轮询标志位->解析数据缓存Buf memset(USART3_Struct.usart3_rxbuf , 0x00 , USART3_Struct.usart3_rxbuf_len);//清空DMA接收缓冲区 } HAL_UART_Receive_DMA(&huart3, USART3_Struct.usart3_rxbuf , rxbuffsize);//重新开启DMA USART3_Struct.Rxflag = 1;//接收完成标志位 USART3_Struct.Busyflag = 1; //正在解析标志位 }

}

叶默12 回答时间:2023-11-8 17:42:43

xmshao 发表于 2023-11-8 17:34
基本锁定代码方面问题,就这么一句话,旁人只有浓浓的无力感!
网上不少类似案例分享,稍微比较下。 如果使 ...

HAL库,自定义空闲中断回调,在串口中断服务函数中调用。在其他位置进行发送接收数组(阻塞),这种情况下可以正常接收,包含接收个数第二次也正常。如果使用DMA发送就会导致第二次接收长度为0,接收DMA配置为一般模式,发送DMA循环模式。接收串口在自定义回调函数中重新开启了DMA串口接收。 在测试过程中仅更改了串口发送方式,DMA(非阻塞)和阻塞发送。不理解为什么串口发送影响了串口接收。HAL_UART_Transmit(&huart3 ,USART3_Struct.rxbuf, 16 , 10);HAL_UART_Transmit_DMA(&huart3 ,USART3_Struct.rxbuf, 16);
watershade 回答时间:2023-11-9 11:25:53

叶默12 发表于 2023-11-8 17:39
HAL库,自定义空闲中断回调,在串口中断服务函数中调用。在其他位置进行发送接收数组(阻塞),这种情 ...

[md]应该不会有影响。idle中断可以不用自定义,建议使用新函数HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_DMA (UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size)。

看看是不是你的代码在ISR中将DMA停止了

butterflyspring 回答时间:2023-11-9 17:17:47
watershade 发表于 2023-11-9 11:25
[md]应该不会有影响。idle中断可以不用自定义,建议使用新函数`HAL_StatusTypeDef HAL_UARTEx_ReceiveToI ...

在接收中断里,如果DMA是normal 模式,看起来是停掉了。
可以在回调函数里接着再使能。



楼主可以再调试一下,看看是不是这么回事。

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版