硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1356|回复: 7
收起左侧

[技术讨论] RS485插拔后产生Framing error

[复制链接]

24

主题

50

回帖

122

积分

初级会员

积分
122
发表于 2024-12-5 08:56:42 | 显示全部楼层 |阅读模式
大家好,我在使用STM32L431进行RS485开发时遇到了一个问题。我使用了ISO7041隔离芯片,在初始状态下,DE引脚为低,而TX和RX都为高。目前的问题是,当我打开电源、重置并插入485时,485的传输和接收都正常。然而,当我拔下并再次插入485时,发生了FE错误。这是为什么?是因为插入485后电压电平不匹配吗?


调试发现errorsflags=2,这应该是FE错误
以下是我的一些代码:

[C] 纯文本查看 复制代码
int main()
{
	HAL_Init();
	SystemClock_Config();
	MX_GPIO_Init();
	MX_LPUART1_UART_Init();
	HAL_GPIO_WritePin(DE485_GPIO_Port, DE485_Pin, GPIO_PIN_RESET);
	initSqQueue(&uart[_LPCOM].Rx, lpuartRxBuff, sizeof(lpuartRxBuff));
	initSqQueue(&uart[_LPCOM].Tx, lpuartTxBuff, sizeof(lpuartTxBuff));
	__HAL_UART_ENABLE_IT(&hlpuart1, UART_IT_RXNE);
	__HAL_UART_ENABLE_IT(&hlpuart1, UART_IT_IDLE);
	while(1)
	{
		Process_Modbus_Receive(_LPCOM); // MODBUS
	}
}

void USER_LPUART1_IRQHandler(void)
{
  uint8_t lpuart1_data;
  if (__HAL_UART_GET_FLAG(&hlpuart1, UART_FLAG_RXNE) != RESET)
  {
    lpuart1_data = (uint8_t)hlpuart1.Instance->RDR & (uint8_t)0x00fff;
    wrEleQueue(&uart[_LPCOM].Rx, lpuart1_data);
    uart[_LPCOM].active = true;
  }
  if (__HAL_UART_GET_FLAG(&hlpuart1, UART_FLAG_IDLE) != RESET)
  {
    uart[_LPCOM].rxIdle = true;
    __HAL_UART_CLEAR_IDLEFLAG(&hlpuart1);
  }
  else
  {
    uart[_LPCOM].rxIdle = false;
  }
}

void LPUART1_IRQHandler(void)
{
  USER_LPUART1_IRQHandler();
  HAL_UART_IRQHandler(&hlpuart1);
}

我目前的解决方案是修改CUBEMX生成的HAL库,直接删除CR3 EIE值的判断并清除标志位。这是正确的吗?它是否会影响其他串行端口的传输和接收,或者这个标志是否会在其他地方被检测到并在其他地方清除。
[C] 纯文本查看 复制代码
    // if (((isrflags & USART_ISR_FE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U))
    if (((isrflags & USART_ISR_FE) != 0U) )
    {
      __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_FEF);

      huart->ErrorCode |= HAL_UART_ERROR_FE;
    }

微信图片_20241205083302.png
微信图片_20241205085038.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2024-12-5 09:46:40 | 显示全部楼层
楼主当前是热插拔485吗,485本身不支持热插拔的。插拔过程中可能会产生电压波动和信号干扰,导致通信错误或设备损坏。
回复

使用道具 举报

24

主题

50

回帖

122

积分

初级会员

积分
122
 楼主| 发表于 2024-12-5 11:40:52 | 显示全部楼层
eric2013 发表于 2024-12-5 09:46
楼主当前是热插拔485吗,485本身不支持热插拔的。插拔过程中可能会产生电压波动和信号干扰,导致通信错误或 ...

当前是在开发阶段,突然发现这个问题的,后面产品不知道需不需要拔插的,听他们说之前的产品485不用的时候是不插的,现在突然发现这个问题就是想看有没有其他方法能够解决这个问题的
回复

使用道具 举报

6

主题

306

回帖

324

积分

高级会员

积分
324
发表于 2024-12-5 13:37:18 | 显示全部楼层
报这个错误不是很正常么,跑协议吧,比如Modbus,有校验,没通过就忽略
回复

使用道具 举报

3

主题

295

回帖

304

积分

高级会员

积分
304
发表于 2024-12-5 16:00:15 | 显示全部楼层
热插拔的时候电压有波动,单片机以为有数据过来,但是这个不是正常数据,报错很正常,hal库的处理好像是直接关掉串口,把hal库关串口那部分删了,报错以后直接清理掉标志就行,
回复

使用道具 举报

24

主题

50

回帖

122

积分

初级会员

积分
122
 楼主| 发表于 2024-12-6 13:14:43 | 显示全部楼层
skyshine 发表于 2024-12-5 16:00
热插拔的时候电压有波动,单片机以为有数据过来,但是这个不是正常数据,报错很正常,hal库的处理好像是直 ...

[C] 纯文本查看 复制代码
void USER_LPUART1_IRQHandler(void)
{
  uint8_t lpuart1_data;
  if (__HAL_UART_GET_FLAG(&hlpuart1, UART_FLAG_RXNE) != RESET) // 判断串口接收中断是否空闲
  {
    lpuart1_data = (uint8_t)hlpuart1.Instance->RDR & (uint8_t)0x00fff;
    wrEleQueue(&uart[_LPCOM].Rx, lpuart1_data);
    uart[_LPCOM].active = true;
    uart[_LPCOM].holdTmr = CONST_RS_485_HOLD_TMR;
    // __HAL_UART_CLEAR_FLAG(&hlpuart1, UART_FLAG_RXNE); // 清楚串口接收中断
  }
  if (__HAL_UART_GET_FLAG(&hlpuart1, UART_FLAG_FE))
  {
    __HAL_UART_CLEAR_FLAG(&hlpuart1, UART_CLEAR_FEF);
    openLpUart1();
    initSqQueue(&uart[_LPCOM].Rx, lpuartRxBuff, sizeof(lpuartRxBuff)); // Initialize the serial port receiving buffer
    memset(lpuartRxBuff, 0, sizeof(lpuartRxBuff));
  }
  if (__HAL_UART_GET_FLAG(&hlpuart1, UART_FLAG_IDLE) != RESET) // 判断串口总线空闲标志位是否置位
  {
    uart[_LPCOM].rxIdle = true;
    __HAL_UART_CLEAR_IDLEFLAG(&hlpuart1);
  }
  else
  {
    uart[_LPCOM].rxIdle = false;
  }
}
void LPUART1_IRQHandler(void)
{
  USER_LPUART1_IRQHandler();
  HAL_UART_IRQHandler(&hlpuart1);
}

这样写可以吗?
回复

使用道具 举报

3

主题

295

回帖

304

积分

高级会员

积分
304
发表于 2024-12-6 14:48:24 | 显示全部楼层
zhouyalong 发表于 2024-12-6 13:14
[mw_shl_code=c,true]void USER_LPUART1_IRQHandler(void)
{
  uint8_t lpuart1_data;

简单看了下,应该没问题,串口中断还是比较简单的,只有几个中断标志位需要处理,你跑跑看看有没有错
我串口这里是用硬汉哥的教程来的,没用hal库的处理,你这个用的lpuart,差异应该不会特别大
可以参考硬汉哥的modbus教程:
https://forum.anfulai.cn/forum.php?mod=viewthread&tid=16989
回复

使用道具 举报

24

主题

50

回帖

122

积分

初级会员

积分
122
 楼主| 发表于 2024-12-11 08:13:08 | 显示全部楼层
skyshine 发表于 2024-12-6 14:48
简单看了下,应该没问题,串口中断还是比较简单的,只有几个中断标志位需要处理,你跑跑看看有没有错
我 ...

目前测试没什么问题
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 08:53 , Processed in 0.045473 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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