Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.07.2013, 21:40   #11
vovken1997
Дружелюбный
Форумчанин
 
Аватар для vovken1997
 
Регистрация: 23.02.2012
Сообщений: 692
По умолчанию

А есть литература по созданию протокола на примере чего либо?

Цитата:
Протокол придется регистрировать в системе
Для чего!? Я думал что раз протокол это правила общения, то для его создания надо в программах указать правила, ну, к примеру, в моём случае с управлением Arduino: специальный символ начала команд, символ конца команд и т.д.
Или протокол это что то другое???
-==ЛЮБОЕ ЗНАНИЕ ДОСТИГАЕТСЯ ТОЛЬКО СОБСТВЕННЫМИ УСИЛИЯМИ!!!==-
vovken1997 вне форума Ответить с цитированием
Старый 05.07.2013, 21:44   #12
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Для чего!?
да не слушайте его, он который раз не в тему, и не о том.

в вашем случае можно просто взять составить какую структуру данным, чтоб можно было понять где начало пакета и его длину, это минимум.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.07.2013, 21:52   #13
vovken1997
Дружелюбный
Форумчанин
 
Аватар для vovken1997
 
Регистрация: 23.02.2012
Сообщений: 692
По умолчанию

Цитата:
в вашем случае можно просто взять составить какую структуру данным, чтоб можно было понять где начало пакета и его длину, это минимум.
Спасибо! Я тогда отведу какой нибуть, не встречающийся в самой информации, символ и за ним байт укажет длину (от 0 до 255 байт, на команды для этой платы должно хватить за глаза), а далее команду, ну то есть её код, а за тем параметры, опять же через не встречающийся в обычном тексте символ.

Типо того?
-==ЛЮБОЕ ЗНАНИЕ ДОСТИГАЕТСЯ ТОЛЬКО СОБСТВЕННЫМИ УСИЛИЯМИ!!!==-
vovken1997 вне форума Ответить с цитированием
Старый 05.07.2013, 22:01   #14
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от vovken1997 Посмотреть сообщение
Спасибо! Я тогда отведу какой нибуть, не встречающийся в самой информации, символ и за ним байт укажет длину (от 0 до 255 байт, на команды для этой платы должно хватить за глаза), а далее команду, ну то есть её код, а за тем параметры, опять же через не встречающийся в обычном тексте символ.

Типо того?
только маркер начала данных стоит делать уникальным от данных, остальное сразу встанет на свои места
Код:
type
 TPacket=record
  Marker:byte;//допустим он равен 2
  Length:byte;//длина пакета
  Data:array[0..0] of byte;//данные пакета(место по умолчанию не выделяется на весь пакет, просто как пример задал)
 end;
это просто как пример.
порою маркер делают более одного байта как и длину.

так же решите, ваш протокол текстовый или бинарный.
с текстовыми и проще и сложнее одновременно, там иначе чуть.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.07.2013, 22:10   #15
vovken1997
Дружелюбный
Форумчанин
 
Аватар для vovken1997
 
Регистрация: 23.02.2012
Сообщений: 692
По умолчанию

Эх, жалко не могу вам репутацию добавить, форум запрещает. ОГРОМНОЕ СПАСИБО!!!
Работать буду бинарно, т.к. Arduino легче так управлять, там с символами боюсь запара будет.
Прислушаюсь к совету насчёт более одного байта в маркере и длине, хотя сама программма пишется для управления портами дуни (этой платы), а их около 20, да и на аналоговые входы/выходы можно подавать от 0 до 1023 значения, так что не думаю, что пакет превысит 255 байт.
Да, забыл спросить, размер пакета указывать вместе с маркерами и длиной, или просто размер информации, хотя не думаю что разница большая???
-==ЛЮБОЕ ЗНАНИЕ ДОСТИГАЕТСЯ ТОЛЬКО СОБСТВЕННЫМИ УСИЛИЯМИ!!!==-
vovken1997 вне форума Ответить с цитированием
Старый 05.07.2013, 22:57   #16
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

по желанию, можно считать маркер частью пакета, можно не считать.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.07.2013, 22:22   #17
vovken1997
Дружелюбный
Форумчанин
 
Аватар для vovken1997
 
Регистрация: 23.02.2012
Сообщений: 692
Вопрос Что то вроде этого???

Сегодня посидел, попробывал реализовать выше сказанное. У меня для работы с COM портом создан специальный модуль в котором функция ReadByte принимает хендл порта и возращает прочитанный байт; WriteByte принимает хендл порта и байт для записи в порт, возращает верно в случае удачной передачи данных, не верно, в случае ошибки; OpenPort открывает порт и принимает номер порта, а возращает его хендл.
Я это написал чтоб были понятны функции которые я использую в своём мини-протоколе.
А работа самого протокола так же вынесена в отделбный модуль, вот его код:
Код:
unit AP;

interface

uses Windows, SysUtils, Com;

type
  TData=record
    Inf: array[0..255] of Byte;
  end;

  TPacket=record
    Marker: byte;
    Length: byte;
    Data: TData;
  end;

  TArduinoProtocol = class
    public
      function Create(COMid: integer): boolean;
      function Destroy: boolean;
      function WriteAP(Data: TData): boolean;
      function ReadAP: TData;
  end;

  var
  Com: TCOM;
  COMHandle: THandle;
  Packet: TPacket;

implementation

{ TArduinoProtocol }

function TArduinoProtocol.Create(COMid: integer): boolean;
begin
COMHandle:=Com.OpenPort(COMid);
if COMHandle=INVALID_HANDLE_VALUE then Create:=False else Create:=True;
end;

function TArduinoProtocol.Destroy: boolean;
begin
if CloseHandle(COMHandle) then Destroy:=True else Destroy:=False;
end;

function TArduinoProtocol.ReadAP: TData;
var
i: Byte;
begin
while not (Packet.Marker=243) do Packet.Marker:=Com.ReadByte(COMHandle);//Ждём, пока устройство передаст маркер начала пакета
Packet.Length:=Com.ReadByte(COMHandle); //Читаем длину пакета
for i:=0 to Packet.Length-1 do Packet.Data.Inf[i]:=Com.ReadByte(COMHandle);//В цикле читаем данные, чтоьб потом их вернуть их функции
ReadAP:=Packet.Data;
Packet.Marker:=0;
end;

function TArduinoProtocol.WriteAP(Data: TData): boolean;
var
i: Byte;
b: boolean;
begin
Packet.Marker:=243;
b:=true;
for i:=0 to 255 do
  if Data.Inf[i]=0 then
  begin
    Packet.Length:=i;//Ищем последний элемент, чтоб установить длину
    break;
  end;

if not Com.WriteByte(COMHandle, Packet.marker) then b:=False;//Пишем маркер начала пакета
if not Com.WriteByte(COMHandle, Packet.Length) then b:=False;//Отправляем длину
for i:=0 to Packet.Length-1 do
if not Com.WriteByte(COMHandle, Data.Inf[i]) then b:=False;//Отправляем данные
WriteAP:=b;
Packet.Marker:=0;
end;

end.
Я пока так набросал, для простоты взял один байт в маркер - это 243.

Компилироваться, компилируется, но я не могу оценить работу, так как схожий модуль надо писать для платы на Си.

Я правильно реализовал выше сказанное???
Что нибуть надо подправить???
-==ЛЮБОЕ ЗНАНИЕ ДОСТИГАЕТСЯ ТОЛЬКО СОБСТВЕННЫМИ УСИЛИЯМИ!!!==-

Последний раз редактировалось vovken1997; 06.07.2013 в 22:29.
vovken1997 вне форума Ответить с цитированием
Старый 06.07.2013, 22:57   #18
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Если правильно передает и принимает и отрабатывает как должно, то все правильно сделал.
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Свой протокол Alex_Gordon Общие вопросы Delphi 8 07.01.2012 00:13
Простейший цикл _PROGRAMM_ Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 9 28.12.2011 10:58
Простейший код :) Paramount Паскаль, Turbo Pascal, PascalABC.NET 1 14.12.2011 22:22
Простейший драйвер zumm Win Api 5 19.07.2011 05:51
Простейший фильтр. KrPr БД в Delphi 3 31.08.2010 09:47