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; }
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++; }
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; }