基金会现场总线(FF)转Modbus设备的调试
来源:FieldIoT | 阅读:1266次 | 2023/7/13 9:01:05
最近在进行基金会现场总线(FF)转Modbus设备的调试时,遇到一个很奇怪的问题,如果485串口(Modbus从站)不在通讯的情况下,程序的任何一个地方打断点,没有异常。但在有485串口MODBUS通信的状况下,在程序任意一个地方打断点,程序就跑飞了。经过调试发现,程序一直进入中断,导致不能执行main函数。
开始怀疑时modbus的3.5毫秒定时器的问题,增加了T35定时器导致时序不正确。
void USART1_IRQHandler(void)
{
if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE)) // 接收非空中断标记被置位
{
__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_RXNE); // 清除中断标记
prvvUARTRxISR(); // 通知modbus有数据到达
}
//溢出-如果发生溢出需要先清空SR的溢出位,再读DR寄存器 则可清除不断入中断的问题
else if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_ORE))//ORE溢出中断,先读SR
{
__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_ORE); // 清除中断标记
}
else if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_TXE)) // 发送为空中断标记被置位
{
prvvUARTTxReadyISR(); // 通知modbus数据可以发松
__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_TXE); // 清除中断标记
}
}
那么在开发modbus设备尤其时从站设备的时候,T35还是建议保留,更符合Modbus通信规范,能够有效保证帧间隔,否则间隔过短,有些主站可能不认。{
if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE)) // 接收非空中断标记被置位
{
__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_RXNE); // 清除中断标记
prvvUARTRxISR(); // 通知modbus有数据到达
}
//溢出-如果发生溢出需要先清空SR的溢出位,再读DR寄存器 则可清除不断入中断的问题
else if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_ORE))//ORE溢出中断,先读SR
{
__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_ORE); // 清除中断标记
}
else if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_TXE)) // 发送为空中断标记被置位
{
prvvUARTTxReadyISR(); // 通知modbus数据可以发松
__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_TXE); // 清除中断标记
}
}