void MODBUS_SERIAL_WAIT_FOR_RESPONSE() { modbus_serial_state=MODBUS_GETADDY; modbus_serial_new = TRUE; while(--modbus_serial_wait >= 0) //se non ci sono caratteri disponibili, aspetto o vado in timeout if(!modbus_kbhit()) delay_us(1); else { //resetto il timer per 30 ms e mi preparo per aspettare di nuovo modbus_serial_wait=30; } //se non ho letto nulla if(frame_received == FALSE) //errore! modbus_rx.error=TIMEOUT; else modbus_rx.error = 0; modbus_calc_crc('0'); //crc_high=modbus_serial_crc.b[1]; //crc_low=modbus_serial_crc.b[0]; if(modbus_serial_crc.b[1] != Message[indix] || modbus_serial_crc.b[0] != Message[indix-1]) modbus_rx.error = TIMEOUT; modbus_serial_wait = MODBUS_SERIAL_TIMEOUT; modbus_serial_new = TRUE; frame_received = FALSE; }
void isr_uart1_rx() { int8 c; c=fgetc(STREAM_PI); current.rda_bytes_received++; /* Modbus */ if (!modbus_serial_new) { if(modbus_serial_state == MODBUS_GETADDY) { modbus_serial_crc.d = 0xFFFF; modbus_rx.address = c; modbus_serial_state++; modbus_rx.len = 0; modbus_rx.error=0; } else if(modbus_serial_state == MODBUS_GETFUNC) { modbus_rx.func = c; modbus_serial_state++; } else if(modbus_serial_state == MODBUS_GETDATA) { if (modbus_rx.len>=MODBUS_SERIAL_RX_BUFFER_SIZE) { modbus_rx.len=MODBUS_SERIAL_RX_BUFFER_SIZE-1; } modbus_rx.data[modbus_rx.len]=c; modbus_rx.len++; } modbus_calc_crc(c); modbus_enable_timeout(TRUE); } }
// Purpose: Puts a character onto the serial line // Inputs: Character // Outputs: None void modbus_serial_putc(int8 c) { timers.rda_tx_buff[timers.rda_tx_length]=c; timers.rda_tx_length++; modbus_calc_crc(c); }