0 / 0 / 0
Регистрация: 25.04.2010
Сообщений: 57
|
|
1 | |
Алгоритм подсчета контрольной суммы16.12.2013, 05:13. Показов 4829. Ответов 5
Метки нет (Все метки)
Всем доброго времени суток!=)) Нужна Ваша помошь (подсказка, подзатыльник...)!
Мучаю устройство с протоколом последовательной передачи данных... и всплыла проблемма при подсчете контрольной суммы...пытаюсь изродить ГУевину для подсчета ее и выплевывания команд в порт... вот только ничерта не получается... Код
u_int16_t MainWymdow::calc_check_sum(u_int8_t *mes_buf, u_int16_t mes_length) { u_int8_t sum_byte[2]; int i; qDebug()<<"num"<<mes_length; sum_byte[0]=sum_byte[1]=sum_byte[2]=0x00; while (mes_length--) { sum_byte[2]=sum_byte[1] & 0xFFFF; //Сдвиг влево sum_byte[1]=sum_byte[0] & 0xFFFF; sum_byte[0]=0x00; i = sum_byte[2] ^ *mes_buf++; // calculate the CRC sum_byte[0] ^= check_sum_table[i] & 0x00ff; sum_byte[1] ^= (check_sum_table[i]>>8); } qDebug()<<"0"<< sum_byte[0]; qDebug()<<"1"<< sum_byte[1]; qDebug()<<"2"<< sum_byte[2]; return (sum_byte[0] | sum_byte[1] << 8 ); } самое обидное... что для модбаса CRC отлично... а тут лес дремучий... протокол чем то смежен с Wake или Slip... но только структурой пакета... Код
const u_int16_t check_sum_table[256]={ 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485, 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D, 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4, 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC, 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B, 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A, 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, 0xIDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xOD2A, 0xBD0B, 0x8D68, 0x9D49, 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70, 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78, 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F, 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067, 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256, 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C, 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634, 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB, 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3, 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, 0xFD2E, 0xID0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0 }; З.Ы.: пример команд: 02 1F 22 12 23 89 38 04 где 02 - STX, 04 - EOT, 1F22 - соответственно 02(динна посылки) 12 и 23 - сами данные, 89 38 - СRC и еще одна 02 1F 22 10 10 14 49 04 За ранее благодарен!=))
0
|
16.12.2013, 05:13 | |
Ответы с готовыми решениями:
5
Подсчет контрольной суммы заголовка IP пакета Вычисление контрольной суммы VHDL/Verilog Структура пакета и расчет контрольной суммы для RS485 Ошибка контрольной суммы передаваемого пакета при выставлении Parity Odd |
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
16.12.2013, 13:00 | 2 |
Сообщение от kotyk
Код
u_int16_t MainWymdow::calc_check_sum(u_int8_t *mes_buf, u_int16_t mes_length) { u_int8_t sum_byte[2]; //все эти u_int16_t и u_int8_t - нестандартные типы? может быть, лучше uint16_t и uint8_t ? ... ... sum_byte[2]=sum_byte[1] & 0xFFFF; //какой смысл в применении 16-bit маски к 8-bit данным? sum_byte[1]=sum_byte[0] & 0xFFFF; //даже если взять маску 0xFF, какой смысл в её применении? никакого! sum_byte[0]=0x00; //напишите просто s[2]=s[1]; s[1]=s[0]; s[2]=0; ... ... return (sum_byte[0] | sum_byte[1] << 8 ); //ох, зря круглые скобки экономите в таких выражениях
0
|
0 / 0 / 0
Регистрация: 25.04.2010
Сообщений: 57
|
|
16.12.2013, 14:15 | 3 |
хз... исходил из вот этого: Код
unsykned int SotsCheckSum(unsykned char far *message_buffer) { unsykned int index,count; unsykned char far *ptr; unsykned char sum_byte[3]; unsykned int sum; count=*message_buffer+3; //Message length sum_byte[0]=sum_byte[1]=sum_byte[2]=0; ptr=message_buffer; while(count--) { sum_byte[2]=sum_byte[1]; //Left shift sum_byte[1]=sum_byte[0]; sum_byte[0]=0; index=sum_byte[2]^*ptr++; //Byte xor checksum MSB sum=check_sum_table[index]; sum_byte[0]^=sum & 0x00ff; sum_byte[1]^=(sum >> 8); } sum=sum_byte[0]+(sum_byte[1] << 8); return(sum); Код
count=*message_buffer+3; //Message length
0
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
16.12.2013, 14:33 | 4 |
Сообщение от kotyk
0
|
0 / 0 / 0
Регистрация: 27.06.2010
Сообщений: 405
|
|
16.12.2013, 20:15 | 5 |
[Offtopys]MainWymdow - это охренеть какое правильнльное место для calc_check_sum[/Offtopys]
0
|
0 / 0 / 0
Регистрация: 25.04.2010
Сообщений: 57
|
|
16.12.2013, 23:43 | 6 |
Сообщение от miyvir
0
|
16.12.2013, 23:43 | |
16.12.2013, 23:43 | |
Помогаю со студенческими работами здесь
6
Алгоритм подсчета контрольной суммы Нужно вычислить алгоритм подсчета контрольной суммы строки Кто может пояснить как работает этот алгоритм подсчета контрольной суммы? Подбор алгоритма подсчета контрольной суммы Функция подсчета контрольной суммы файла и занятый файл Библиотека COMCRC.DLL для подсчета контрольной суммы Как убрать небезопасный код из функции подсчёта контрольной суммы? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |