Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 27.11.2014, 11:00
Rusanov_Ivan Rusanov_Ivan вне форума
Прохожий
 
Регистрация: 27.11.2014
Сообщения: 2
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Связь ПК с микроконтроллером COM порт

Помогите разобраться! Стоит задача обмена информации между компьютером и микроконтроллером 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  
Старый 27.11.2014, 11:29
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Rusanov_Ivan
Я не пойму если передаю например число 1235 то оно так и передастся (0x04D3) или оно передастся как отдельные символы 1(0x31), 2(0x31)...
COM-порт является последовательным портом, а не параллельным, поэтому данные передаются побитно, но в первом приближении можно считать что они передаются побайтно. Твоё число 1235 хранится в переменной типа Integer имеющей размер 4 байта, что в шестнадцатеричном виде представляется как $000004D3 или как 4 байта $00,$00,$04,$D3, а учитывая что байты в целочисленных типах хранятся в обратном порядке (в связи с "остроконечностью" процессоров Intel) это число будет передано как 4 байта в таком порядке: $D3,$04,$00,$00. Если же передавать не число типа Integer, а строку например типа AnsiString вот так '1235', тогда будет передано 4 байта соответствующих кодам ASCII этих символов: $31,$32,$33,$35.

Последний раз редактировалось poli-smen, 27.11.2014 в 11:45.
Ответить с цитированием
  #3  
Старый 27.11.2014, 11:47
Rusanov_Ivan Rusanov_Ivan вне форума
Прохожий
 
Регистрация: 27.11.2014
Сообщения: 2
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

poli-smen Спасибо! Кое что проясняется. Может подскажете в каком виде лучше передавать данные учитывая что передавать необходимо только целые числа. Не хотелось бы использовать AnsiStrin т.к. если число будет 100000 то передавать придется 7 байт, хотя оно помещается в 3. Да и не понял а почему при передачи AnsiString '1235' первым пойдет $30 а не $31?
Ответить с цитированием
  #4  
Старый 27.11.2014, 11:59
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Rusanov_Ivan
Может подскажете в каком виде лучше передавать данные учитывая что передавать необходимо только целые числа. Не хотелось бы использовать AnsiStrin т.к. если число будет 100000 то передавать придется 7 байт, хотя оно помещается в 3.
Вообще числа в прямом виде лучше не передавать, потому что нужно ещё определить какой-нибудь стоповый байт, чтобы по нему ориентироваться где закончилась одна порция данных и начинается новая, если же передавать числа в прямом виде, то один из его байтов может совпасть со стоповым байтом, что ошибочно может быть принято за конец порции. А вообще всё зависит от принятого в работу протокола.
Цитата:
Сообщение от Rusanov_Ivan
Да и не понял а почему при передачи AnsiString '1235' первым пойдет $30 а не $31?
Конечно же первым пойдёт $31, а не $30 - там я ошибся (уже исправил ).
Ответить с цитированием
  #5  
Старый 27.11.2014, 22:15
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
Может подскажете в каком виде лучше передавать данные
Побайтово. Объявить переменную типа байт и слать. Или массив байтов.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #6  
Старый 12.12.2014, 22:59
Nicolass44 Nicolass44 вне форума
Прохожий
 
Регистрация: 15.08.2014
Сообщения: 19
Версия Delphi: Delphi 5
Репутация: 70
По умолчанию

Передавать данные в двоичной форме я бы не рисковал. При таких объёмах данных лучше использовать классический ANSI, в этом случае можно поставить однозначные метки заголовка и конца строки, которые никак не совпадут с телом строки.
Если же вы делаете бинарную передачу, то надо писать полноценный арбитраж со стороны МК, а именно:
1. CRC, куда ж без него.
2. Проверку диапазонов значений начала строки и других ключевых элементов, диапазон значений которых известен.
3. Сброс счётчика прерывания в случае повреждения данных и поиск начала нового сообщения по ключевым факторам. Например, можно начать сообщение известной последовательностью. Старый как мир протокол A5, сообщение начинается 0xA5, кончается 0x5A, их XOR даёт FF, AND = 0. Две логические операции заменяют КС и CRC во многих случаях.
Ну или могу дать табличный метод расчёта CRC, две таблицы во флеше, считает CRC за 5+длина_строки циклов.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:00.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025