![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Помогите разобраться! Стоит задача обмена информации между компьютером и микроконтроллером pic18. Протокол обмена видится в таком формате: (начало пакета 1 байт: команда (чтение/запись) 1 байт: кол-во передаваемых байт данных 1 байт: данные).
Элементарному общению этих двух товарищей я научил (мигать светодиодом). Я совсем запутался с форматом передаваемых данных. т.е. Я не пойму если передаю например число 1235 то оно так и передастся (0x04D3) или оно передастся как отдельные символы 1(0x31), 2(0x31)... Объясните мне тугому пожалуйста. Код:
MasInt = array [0..10] of integer; procedure WriteComm(Transmit: MasInt); begin WriteFile(CommHandle,Transmit, Length(Transmit),KolByte,@Ovr); end; Так же интересует вопрос приема если я с МК шлю байт за байтом числа как они принимаются на ПК в таком же виде как я отправил или без моего ведома каждый байт преобразуется в соответствии с ANSII символ. Последний раз редактировалось Admin, 27.11.2014 в 19:54. |
#2
|
||||
|
||||
![]() Цитата:
Последний раз редактировалось poli-smen, 27.11.2014 в 11:45. |
#3
|
|||
|
|||
![]() poli-smen Спасибо! Кое что проясняется. Может подскажете в каком виде лучше передавать данные учитывая что передавать необходимо только целые числа. Не хотелось бы использовать AnsiStrin т.к. если число будет 100000 то передавать придется 7 байт, хотя оно помещается в 3. Да и не понял а почему при передачи AnsiString '1235' первым пойдет $30 а не $31?
|
#4
|
||||
|
||||
![]() Цитата:
Цитата:
![]() |
#5
|
||||
|
||||
![]() Цитата:
jmp $ ; Happy End! The Cake Is A Lie. |
#6
|
|||
|
|||
![]() Передавать данные в двоичной форме я бы не рисковал. При таких объёмах данных лучше использовать классический ANSI, в этом случае можно поставить однозначные метки заголовка и конца строки, которые никак не совпадут с телом строки.
Если же вы делаете бинарную передачу, то надо писать полноценный арбитраж со стороны МК, а именно: 1. CRC, куда ж без него. 2. Проверку диапазонов значений начала строки и других ключевых элементов, диапазон значений которых известен. 3. Сброс счётчика прерывания в случае повреждения данных и поиск начала нового сообщения по ключевым факторам. Например, можно начать сообщение известной последовательностью. Старый как мир протокол A5, сообщение начинается 0xA5, кончается 0x5A, их XOR даёт FF, AND = 0. Две логические операции заменяют КС и CRC во многих случаях. Ну или могу дать табличный метод расчёта CRC, две таблицы во флеше, считает CRC за 5+длина_строки циклов. |