Добрый вечер.
У меня такая проблема пытаюсь заставить мк работать по rs 485, есть определенный протокол
в отправляемом пакете надо посчитать контрольную сумму. Для подсчёта контрольной суммы используется 16-ти битная циклическая контрольная сумма стандарта CRC_CCITT ( полином $1021 , x^16 + x^15 + x^2 + 1)
Пример отсылаемого пакета
2D старт бит
0F адрес
67 …..
07……
01……
6D младший байт контрольной суммы
6A старший байт контрольной суммы
Вот функция подсчета crc которую я использую
int calcrc(unsigned char *ptr, int count) //Функция подсчета crc
{unsigned short crc;
unsigned char i;
crc = 0;
while (--count >= 0)
{
crc = crc ^ (unsigned short)*ptr++ << 8;
i = 8;
do
{
if (crc & 0x8000)
crc = crc << 1 ^ 0x1021;
else
crc = crc << 1;
} while(--i);
}
return (crc);
}
Функция возвращает только младший байт контрольной суммы.
Как получить старший байт ??????????????????????
Подскажите пожалуйста
Тут нужно посмотреть, что означает "unsigned short" в сандартной библиотеке Вашего компилятора, возможно это 8-битное число. Это самая распространенная проблема портирования кода - у каждого компилятора свои понятия размерности данных. Я всегда использую определения для переменных вида uint8_t, uint16_t, int8_t итд, чтоб избежать подобных проблем. Попробуйте заменить "unsigned short" на "uint16_t" и может все станет ок? Не забудьте добавить #include <stdint.h> - там содержатся описания этих типов.
void add_to_buffer(char c) //ф-ия добавление байта в буфер
{
buffer[buffer_count]=c; //добавляем
if (buffer_count<buffer_size) //проверям не вылезло ли за размер
buffer_count++; //если нет то увеличиваем
c=0;
};
char transmit_buffer() //отсылаем буфер
{
char k;
k=0;
while ((buffer_count--)!=0) //цикл отсылки
putchar(buffer[k++]); //непосредственно отправка в ком порт ну или замени на свой UDR + задержка или проверка готовности
};
У меня нет CV, поэтому могу помочь только теоретически.
Вы уверены, что у CV int имеет размерность 16 бит, а не 8? Я уже на подобные грабли наступал раньше.
Опишите функцию как uint16_t calcrc(uint8_t *ptr, int16_t count) - так все предельно однозначно.