Exemplo n.º 1
0
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;

}
Exemplo n.º 2
0
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);
	}
}
Exemplo n.º 3
0
// 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);
}