Перейти к содержанию
Переключить боковую панель
Экзомех
Поиск
Создать учётную запись
Войти
Персональные инструменты
Создать учётную запись
Войти
Страницы для неавторизованных редакторов
узнать больше
Вклад
Обсуждение
Навигация
Заглавная страница
Свежие правки
Категории
Инструменты
Ссылки сюда
Связанные правки
Служебные страницы
Сведения о странице
Редактирование:
Mindset
(раздел)
Статья
Обсуждение
русский
Читать
Править
Править код
История
Ещё
Читать
Править
Править код
История
Внимание:
Вы не вошли в систему. Ваш IP-адрес будет общедоступен, если вы запишете какие-либо изменения. Если вы
войдёте
или
создадите учётную запись
, её имя будет использоваться вместо IP-адреса, наряду с другими преимуществами.
Анти-спам проверка.
Не
заполняйте это!
=== Sample C Code for Parsing a Packet === e following is an example of a program, implemented in C, which reads from a stream and (correctly) parses Packets continuously. Search for the word TODO for the two sections which would need to be modied to be appropriate for your application. Note: For simplicity, error checking and handling for standard library function calls have been omitted. A real application should probably detect and handle all errors gracefully.<syntaxhighlight lang="c++" line="1"> #include <stdio.h> #define SYNC 0xAA #define EXCODE 0x55 int parsePayload( unsigned char *payload, unsigned char pLength ) { unsigned char bytesParsed = 0; unsigned char code; unsigned char length; unsigned char extendedCodeLevel; int i; /* Loop until all bytes are parsed from the payload[] array... */ while( bytesParsed < pLength ) { /* Parse the extendedCodeLevel, code, and length */ extendedCodeLevel = 0; while( payload[bytesParsed] == EXCODE ) { extendedCodeLevel++; bytesParsed++; } code = payload[bytesParsed++]; if( code & 0x80 ) length = payload[bytesParsed++]; else length = 1; /* TODO: Based on the extendedCodeLevel, code, length, * and the [CODE] Definitions Table, handle the next * "length" bytes of data from the payload as * appropriate for your application. */ printf( "EXCODE level: %d CODE: 0x%02X length: %d\n", extendedCodeLevel, code, length ); printf( "Data value(s):" ); for( i=0; i<length; i++ ) { printf( " %02X", payload[bytesParsed+i] & 0xFF ); } printf( "\n" ); /* Increment the bytesParsed by the length of the Data Value */ bytesParsed += length; } return( 0 ); } int main( int argc, char **argv ) { int checksum; unsigned char payload[256]; unsigned char pLength; unsigned char c; unsigned char i; /* TODO: Initialize 'stream' here to read from a serial data * stream, or whatever stream source is appropriate for your * application. See documentation for "Serial I/O" for your * platform for details. */ FILE *stream = 0; stream = fopen( "COM4", "r" ); /* Loop forever, parsing one Packet per loop... */ while( 1 ) { /* Synchronize on [SYNC] bytes */ fread( &c, 1, 1, stream ); if( c != SYNC ) continue; fread( &c, 1, 1, stream ); if( c != SYNC ) continue; /* Parse [PLENGTH] byte */ while( true ) { fread( &pLength, 1, 1, stream ); if( pLength ~= 170 ) break; } if( pLength > 169 ) continue; /* Collect [PAYLOAD...] bytes */ fread( payload, 1, pLength, stream ); /* Calculate [PAYLOAD...] checksum */ checksum = 0; for( i=0; i<pLength; i++ ) checksum += payload[i]; checksum &= 0xFF; checksum = ~checksum & 0xFF; /* Parse [CKSUM] byte */ fread( &c, 1, 1, stream ); /* Verify [CKSUM] byte against calculated [PAYLOAD...] checksum */ if( c != checksum ) continue; /* Since [CKSUM] is OK, parse the Data Payload */ parsePayload( payload, pLength ); } return( 0 ); } </syntaxhighlight>
Описание изменений:
Обратите внимание, что все добавления и изменения текста статьи рассматриваются как выпущенные на условиях лицензии Creative Commons Zero (общественное достояние) (см.
Экзомех:Авторские права
). Если вы не хотите, чтобы ваши тексты свободно распространялись и редактировались любым желающим, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого.
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ МАТЕРИАЛЫ, ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ!
Отменить
Справка по редактированию
(в новом окне)