Для встроенной системы я пишу код на c для проверки полученного байтового массива на основе предоставленного CRC. Система активна в RTU Modbus.
В моем модульном тесте у меня есть следующий (правильный) байтовый массив:
unsigned char frame[7] = { 0x01, 0x04, 0x02, 0x03, 0xFF, 0x80, 0xF9 }
Последние два байта - предоставленный код CRC, который я хочудля проверки.
Мой подход заключается в разделении полученного массива на два массива. Первый массив имеет длину n-2, а второй массив имеет длину 2. После этого создайте свой собственный код CRC на основе первого массива, и, наконец, я хочу проверить, совпадают ли второй массив и мой собственный код CRC.
Это код, который у меня сейчас есть:
bool validateCrc16ModbusFrame(unsigned char frame[])
{
// A valid response frame consists of at least 6 bytes.
size_t size = sizeof frame;
if (size < 6) {
return false;
}
// Split the frame into the 'bytes to check' and the 'provided CRC.'
int newSize = size - 2;
unsigned char* bytesToCheck = (unsigned char*)_malloca(newSize + 1); // Not sure about this line.
char providedCrc[2];
memcpy(bytesToCheck, frame, newSize * sizeof(int));
memcpy(providedCrc, &frame[newSize], 2 * sizeof(int));
// Calculate the CRC with the bytes to check.
uint16_t calculatedCrc = calculateCrc16Modbus(bytesToCheck, newSize); // This function calculates the correct CRC code.
_freea(bytesToCheck); // Not sure about this line.
// The CRC is provided as two uint8_t bytes. Convered the two uint8_t to one uint16_t.
uint8_t firstByteProvidedCrc = providedCrc[0];
uint8_t secondByteProvidedCrc = providedCrc[1];
uint16_t uint16ProvidedCrc = ((uint16_t)firstByteProvidedCrc << 8) | secondByteProvidedCrc;
// Compare the provided CRC and the calculated CRC.
bool result = uint16ProvidedCrc == calculatedCrc;
return result;
}
Но когда я запускаю тестовый код, он вылетает с сообщением '!! Этот тест, вероятно, разбит !! Когда я отлаживаю тестовый код, я получаю исключение с сообщением «TestProjectName.exe вызвал точку останова». Я думаю, что проблема возникает из-за создания и / или освобождения памяти для динамического байтового массива.
Кто-нибудь знает, что я делаю неправильно?
Заранее спасибо.
С уважением, Френк