I have no experience with RS485 but perhaps you can enable the noise and framing interrupt errors and see if you can detect that situation.
Not tested but should work I believe.
Code:
#define IRQ_ERROR_PRIORITY 48 // 0 = highest priority, 255 = lowest
void setup() {
delay(1000);
// Frame error and Noise Error Interrupt Enable
// Set error IRQ priority lower (higher priority) than that of the status IRQ PRIORITY 64,
NVIC_SET_PRIORITY(IRQ_UART0_ERROR, IRQ_ERROR_PRIORITY); // E PRIORITY 48, 0 = highest priority, 255 = lowest
// NVIC_SET_PRIORITY(IRQ_UART0_ERROR, NVIC_GET_PRIORITY(IRQ_UART0_STATUS) - 16); // 0 = highest priority, 255 = lowest
// Enable UART0 interrupt on (Frame Error, Noise Error) and enable IRQ
UART0_C3 |= UART_C3_FEIE | UART_C3_NEIE; // Framing Error Interrupt Enable // Noise Error Interrupt Enable
// UART_C3_PEIE 0x01 // Parity Error Interrupt Enable
// UART_C3_ORIE 0x08 // Overrun Error Interrupt Enable
NVIC_ENABLE_IRQ(IRQ_UART0_ERROR);
attachInterruptVector(IRQ_UART0_ERROR, UART0RxError);
//Set up Frame error and Noise Error before calling Serial1.begin(..)
Serial.begin(9600); // USB is always 12 Mbit/sec
Serial1.begin(9600); // UART0 RS485
}
void loop() {
// put your main code here, to run repeatedly:
Serial.println("Hello World...");
delay(2000); //
}
void UART0RxError(void)
{
uint8_t E;
if (UART0_S1 & UART_S1_FE) {
__disable_irq();
E = UART0_D; // dummy unload
UART0_CFIFO = UART_CFIFO_RXFLUSH;
UART0_D = 0; // dummy upload
UART0_CFIFO = UART_CFIFO_TXFLUSH;
__enable_irq();
Serial.print("BUS Frame Error ");
Serial.println(E);
}
if (UART0_S1 & UART_S1_NF) {
__disable_irq();
E = UART0_D; // dummy unload
UART0_CFIFO = UART_CFIFO_RXFLUSH;
UART0_D = 0; // dummy upload
UART0_CFIFO = UART_CFIFO_TXFLUSH;
__enable_irq();
Serial.print("BUS Noise Flag ");
Serial.println(E);
}
}