diff --git a/hdlc/client.c b/hdlc/client.c index a4307af..51b4b0a 100644 --- a/hdlc/client.c +++ b/hdlc/client.c @@ -3,6 +3,9 @@ #include #include +#define START_FLAG 0x7E +#define END_FLAG 0x7E + void init_Client(Client* client, bool test_is_valid, uint8_t address, void* serial_port) { client->TEST_IS_VALID = test_is_valid; client->address = address; @@ -34,7 +37,7 @@ void connect(Client* client) { HDLCFrame frame; init_HDLCFrame(&frame, 0, 0, data + 3, 256 - 6); - if (validate(client, &frame, data, 256)) { + if (validate(data, 256)) { return; } else { // Connection failed @@ -66,32 +69,28 @@ void receive_data(Client* client, uint8_t* recivedData, int lenRecived) { } } -bool validate(Client* client, HDLCFrame* frame, uint8_t* received_data, size_t received_length) { - uint8_t control = received_data[2]; - if ((control & 0x01) == 0) { - // I-frame - printf("i frame\n"); - uint8_t send_sequence_number = (control >> 1) & 0x07; - uint16_t crc = (received_data[received_length - 2] << 8) | received_data[received_length - 3]; - uint16_t calculated_crc = calculate_fcs(received_data + 1, received_length - 4); - if (crc == calculated_crc && send_sequence_number == client->_receive_sequence_number && client->TEST_IS_VALID) { - client->_receive_sequence_number++; - return true; - } - } else if ((control & 0x03) == 1) { - // S-frame - printf("s frame\n"); - // Handle S-frame - } else { - // U-frame - printf("u frame\n"); - // Handle U-frame +#include + +bool validate(const uint8_t* frame, size_t length) { + if (length < 4 || frame[0] != START_FLAG || frame[length - 1] != END_FLAG) { + // Invalid frame length or missing start/end flag + return false; } - return false; + + uint16_t received_fcs = (frame[length - 3] << 8) | frame[length - 2]; + uint16_t calculated_fcs = 0xFFFF; + + for (size_t i = 1; i < length - 3; i++) { + uint8_t byte = frame[i]; + calculated_fcs = (calculated_fcs >> 8) ^ (calculated_fcs << 8) ^ byte; + calculated_fcs &= 0xFFFF; + } + + return received_fcs == calculated_fcs; } int sendSerialData(const char* port, uint8_t* data, size_t length) { - int serial_port = open(port, O_RDWR); // Replace "port" with your serial port device + int serial_port = open(port, O_RDWR); if (serial_port < 0) { perror("Error opening the serial port"); diff --git a/hdlc/client.h b/hdlc/client.h index ca306cb..fb18c71 100644 --- a/hdlc/client.h +++ b/hdlc/client.h @@ -1,6 +1,4 @@ -// -// Created by 79513 on 19.06.2023. -// + #ifndef CLIENT_H #define CLIENT_H @@ -23,7 +21,7 @@ void init_Client(Client* client, bool test_is_valid, uint8_t address, void* seri void connect(Client* client); void send(Client* client, uint8_t* data, size_t data_length); void receive_data(Client* client, uint8_t* recivedData, int lenRecived); -bool validate(Client* client, HDLCFrame* frame, uint8_t* received_data, size_t received_length); +bool validate(const uint8_t* frame, size_t length); int sendSerialData(const char* port, uint8_t* data, size_t length); int receiveSerialData(const char* port, uint8_t* data, int length);