Сбой при проверке CRC динамического байтового массива |с - PullRequest
1 голос
/ 22 октября 2019

Для встроенной системы я пишу код на 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 вызвал точку останова». Я думаю, что проблема возникает из-за создания и / или освобождения памяти для динамического байтового массива.

Кто-нибудь знает, что я делаю неправильно?

Заранее спасибо.

С уважением, Френк

1 Ответ

2 голосов
/ 23 октября 2019

Проблема заключается в том, что вызовы memcpy умножают размер новостей на размер (int), когда выделяются только символы новостей + 1. Вероятно, они должны быть:

   memcpy(bytesToCheck, frame, newSize);       /* no sizeof(int) */
   memcpy(providedCrc, &frame[newSize], 2);    /* no sizeof(int) */

Также вам не нужно копировать или разбивать массив. Вы можете рассчитать CRC для исходного массива, включая добавленный CRC, и полученный CRC будет равен нулю, если CRC не будет дополнен после, или некоторому ненулевому постоянному значению, если CRC будет дополнен после.

...