Мастер Modbus регулярно получает ответ с битым последним байтом CRC
Ведомое устройство на STM32 отправляет ответ по RS-485 так:
HAL_GPIO_WritePin(DE_GPIO_Port, DE_Pin, GPIO_PIN_SET);
for (size_t i = 0; i < len; i++) {
while (!(USART2->SR & USART_SR_TXE)) { }
USART2->DR = frame[i];
}
HAL_GPIO_WritePin(DE_GPIO_Port, DE_Pin, GPIO_PIN_RESET);
Мастер почти всегда видит ошибку CRC: последний байт искажён или отсутствует. Что не так?
- DE снимается до флага TC — байт ещё в отправке
- TXE нужно проверять после записи, а не до
- CRC Modbus считается без последнего байта
- Выход DE нужно переключать до инициализации UART
