|
ppp на Siemens MC35i, помогите с CRC алгоритмом |
|
|
|
Aug 13 2008, 12:00
|
Частый гость
 
Группа: Свой
Сообщений: 106
Регистрация: 27-11-07
Из: Пермь
Пользователь №: 32 732

|
Пытаюсь реализовать TCP/IP/PPP через GPRS на модеме Siemens MC35i. Сразу же наткнулся на проблему. Не могу сосчитать контрольную сумму кадра PPP. Где-то нашел вот это: Цитата Name : "X-25" Width : 16 Poly : 1021 Init : FFFF RefIn : True RefOut : True XorOut : FFFF Check : 906E (здесь я не догоняю что есть RefIn, RefOut и Check) Прогоняю через функцию... Код unsigned short Crc16(unsigned char *pcBlock, unsigned short len) { unsigned short crc = 0xFFFF; unsigned char i; while (len--) { crc ^= *pcBlock++ << 8; for (i = 0; i < 8; i++) crc = crc & 0x8000 ? (crc << 1) ^ 0x1021 : crc << 1; } return crc ^ 0xFFFF; } ...следующий пакет... Цитата FF03C021010300190206000A0000070208020506BC62123F0305C22305 ...у которого CRC должен быть EEF1, но я получаю E3E2. О, гуру L2P, подскажите где я на грабли наступаю. П.С. Забить на пипипи и взять "нормальный" модем с уже реализованным стеком TCP/IP не предлагать.
Сообщение отредактировал lolful - Aug 13 2008, 12:01
|
|
|
|
|
 |
Ответов
|
Oct 2 2008, 11:04
|

Знающий
   
Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053

|
Сделал зеркалирование: uint8 mas[29]={0xFF,0x03,0xC0,0x21,0x01,0x03,0x00,0x19,0x02,0x06,0x00,0x0A,0x00,0x00,0 x07,0x02,0x08,0x02,0x05,0x06,0xBC,0x62,0x12,0x3F,0x03,0x05,0xC2,0x23,0x05}; uint8 mas_bit[8]={1,2,4,8,16,32,64,128}; uint8 ch0,ch1; CRC=0xFFFF; for(x=0;x<29;x++) { ch0=mas[x]; ch1=0; for(z=0;z<8;z++) if(ch0 & mas_bit[z]) ch1|=mas_bit[7-z]; CRC=crc16_o(mas[ch1],CRC); } CRC1: 5C07 CRC1^: A3F8 Т.е. не равно EEF1. Я не совсем понимаю смысл фразы: Цитата Затем эти данные прогоняются через функцию CRC, результат зеркалируется Конкретно: результат зеркалируется. Т.е. мы берём байт, зеркалируем его, прогоняем через CRC. Полученую CRC зеркалируем (2 байта), потом опять туже процедуру? Я так делал, CRC не совпадает.
--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
|
|
|
|
|
Oct 2 2008, 11:49
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Используйте теги обрамления кода (кнопочка # в форме ввода сообщения) для оформления исходников. Иначе они совершенно не читаются. Смотрите вниимательно в эти две строчки: Код ch0=mas[x]; ..... CRC=crc16_o(mas[ch1],CRC); Возможно, проблема в чтении из массива во второй? Более простым решением будет отзеркалить весь алгоритм. Тогда вам не придется зеркалить каждый входной байт и результат после обсчета: Код uint8_t mas[] ={0xFF,0x03,0xC0,0x21,0x01,0x03,0x00,0x19,0x02,0x06,0x00,0x0A,0x00,0x00,0x07,0x0 2,0x08,0x02,0x05,0x06,0xBC,0x62,0x12,0x3F,0x03,0x05,0xC2,0x23,0x05}; uint16_t CRC(uint16_t crc, uint8_t data) { crc ^= data; for(uint8_t i = 0; i < 8; ++i) { if(crc & (1<<0)) crc = (crc >> 1) ^ 0x8408; else crc = crc >> 1; } return crc; }
int main(int argc, char* argv[]) { uint16_t crc = 0xFFFF; for(size_t i = 0; i < sizeof(mas); ++i) crc = CRC(crc, mas[i]); printf("CRC = %4.4X, ~CRC = %4.4X", crc, crc^0xFFFF); return 0; }
>Test.exe CRC = 0E11, ~CRC = F1EE Кстати: Код uint8_t mas[]="123456789"; .... for(size_t i = 0; i < sizeof(mas) - 1; ++i) // C-строка завршается нулем, его обсчитывать не надо .... >Test.exe CRC = 6F91, ~CRC = 906E Последний результат совпадает с приведенным выше тестовым числом Check
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
Сообщений в этой теме
lolful ppp на Siemens MC35i Aug 13 2008, 12:00 lolful Вот что еще добавлю.
Я подключаюсь к gprs (atd*98... Aug 14 2008, 04:15 lolful Так. Кажется разобрался. RefIn и RefOut означают,... Aug 14 2008, 06:00 vesago Посмотрите в этой теме документец. Там доходчиво п... Aug 16 2008, 19:01 lolful Насчет ppp мне было все понятно. Вопрос был задан ... Aug 19 2008, 08:46 lolful Итак, по PPP удалось подключиться. Удается посылат... Aug 26 2008, 08:00 akoyur Цитата(lolful @ Aug 26 2008, 11:00) Итак,... Jan 17 2011, 14:33  follow_me Цитата(akoyur @ Jan 17 2011, 16:33) Так ч... Jan 17 2011, 16:18   muchacho Цитата(follow_me @ Jan 17 2011, 19:18) ..... Jan 20 2011, 08:11 Beginning БЛИН!!!! Я УЖЕ СУМА СХОЖУ!... Oct 2 2008, 09:05 Сергей Борщ Цитата(Beginning @ Oct 2 2008, 12:05) mas... Oct 2 2008, 09:17 Beginning Спасибо, попробую именно зерколирование октетов. Oct 2 2008, 09:25 Beginning Цитатаmas[ch1]
Да... надо на отдых.
За рабочий ис... Oct 2 2008, 12:24
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|