コード例 #1
0
bool receiveMedtronicMessage (uint8_t message[], size_t * const length) {
    size_t i = 0;
	uint8_t lastData = 0xFF;

  RFST = RFST_SIDLE;
  RFST = RFST_SRX;
  PKTLEN = 0xFF;

  enableTimerInt();

	for( ; i<128 && lastData != 0x00; ++i ) {
	  while (!RFTXRXIF) {
		usbUartProcess();
		usbReceiveData();
		if (RFIF & 0x40) {
		  RFIF &= 0xBF;
		  lastData = 0xFF;
		  i = 0;
		  RFST = RFST_SIDLE;
		  RFST = RFST_SRX;
		  resetTimerCounter();
		}
	  }
	  stopTimerInt ();
	  rfMessage[i] = RFD;
	  lastData = rfMessage[i];
	  TCON &= ~0x02;
	}
  rfLength = i-1;
  RFST = RFST_SIDLE;

  //P1_1 = ~P1_1;

  decode_4b6b( rfMessage, rfLength, message, length );

  if( check_crc8( message, *length - 1 ) ) {
    return false;
  }

  if( check_crc16( message, *length -2 ) ) {
    return false;
  }

  if( check_crc8( message, *length - 2 ) ) {
    return false;
  }

  if( check_crc16( message, *length - 3 ) ) {
    return false;
  }

  return true;
}
コード例 #2
0
ファイル: modbus.c プロジェクト: annualweekendcoding/projects
void modbus_processSlaveFrame(uint8_t *query, int query_length) 
{
	if (check_crc16(query, query_length) == query_length) 
  {
		modbus_slave_manage(query, query_length);
	}
  else modbus_crc_errors++;
}
コード例 #3
0
ファイル: modbus.c プロジェクト: annualweekendcoding/projects
int errorInFrame(uint8_t *frame, uint8_t frameLength) {
	int frameHasError = FALSE;

	if (check_crc16(frame, frameLength) != frameLength) {
		return INVALID_CRC;
	}

	if ((frame[0] != MODBUS_SLAVE_ID) && (frame[0] != MODBUS_BROADCAST_ADDRESS)) {
		return NOT_FOR_US;
	}

	switch (frame[1]) { // check function code and requested addresses	case
	case FC_FORCE_SINGLE_COIL:
	case FC_READ_COIL_STATUS:
		if ((frame[2] > MODBUS_MAX_BITADDRESSES) || (frame[2] > MODBUS_MAX_BITADDRESSES)) {
			frameHasError = ILLEGAL_DATA_ADDRESS;
		}
		break;
	case FC_READ_INPUT_STATUS:
		if ((frame[2] > MODBUS_MAX_BITADDRESSES) || (frame[2] > MODBUS_MAX_BITADDRESSES)) {
			frameHasError = ILLEGAL_DATA_ADDRESS;
		}
		break;
	case FC_READ_HOLDING_REGISTERS:
		if ((frame[3] > MODBUS_MAX_WORDADDRESSES) || (frame[2] > MODBUS_MAX_WORDADDRESSES)) {
			frameHasError = ILLEGAL_DATA_ADDRESS;
		}
		break;
	case FC_PRESET_SINGLE_REGISTER:
	case FC_READ_INPUT_REGISTERS:
		if ((frame[3] > MODBUS_MAX_WORDADDRESSES) || (frame[2] > MODBUS_MAX_WORDADDRESSES)) {
			frameHasError = ILLEGAL_DATA_ADDRESS;
		}

	case FC_FORCE_MULTIPLE_COILS:
		//todo implementing that part
	case FC_PRESET_MULTIPLE_REGISTERS:
		//todo implementing that part
	case FC_READ_EXCEPTION_STATUS:
		//todo implementing that part
	case FC_REPORT_SLAVE_ID:
		//todo implementing that part
	default:
		frameHasError = ILLEGAL_FUNCTION;
		break;
	}
	return frameHasError;
}