Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Компонент TMS Async 32 (СОМ порт) ,объясните как с ним работать


ZV ©   (2010-01-04 16:42:00) 

В СОМ порт приходят данные (пакет  140 байт). Мне нужно его обработать и отправить результат обратно в СОМ порт. Решил использовать компонент  TMS Async 32.  Но не могу с ним разобраться. Русскоязычной информации по использованию данного компонента  я  не нашел. В примерах,  идущих с этим компонентом и находящихся в сети, работа с буфером не рассматривается.  Пожалуйста, кто работает с данным  компонентом,  объясните,  что у него  к чему. Использую  Delphi 2009. Модераторы, пожалуйста,  не блокируйте эту тему, я уже 3 дня мучаюсь над этим компонентом, но толку мало, сам я с ним не разберусь.
На данный момент для отправки массива байт использую следующую процедуру:

procedure TForm2.Button3Click(Sender: TObject);
 var
   Temp : array[0..20] of byte;
begin
Temp[0]:=86;
Temp[1]:=100;
Temp[2]:=105;
Temp[3]:=109;
VaComm1.WriteBuf(Temp,Length(Temp));
end;

Все нормально работает, устройство подключенное к СОМ  порту получает пакет.
Но с получением  данных в СОМ порт возникает проблема , хочу чтобы входящие байты из буфера присвоились массиву для этого использую следующую процедуру

procedure TForm2.VaComm1RxBuf(Sender: TObject; Data: PVaData; Count: Integer);
Temp : array[0..140] of byte;
begin
    Count:=VaComm1.ReadBufUsed; //Количество байт находящихся в буфере
    VaComm1.ReadBuf(Temp,Count);
end;

Переменная Count все время возвращает значение 0, хотя данные в СОМ порт пришли.
На данный момент данные из СОМ порта  читаю этой процедурой

procedure TForm2.VaComm1RxChar(Sender: TObject; Count: Integer);
var
 Tmp: string;
begin
dlina:=dlina+Count;
  Memo1.Lines.Text   :=   Memo1.Lines.Text   +  VaComm1.ReadText ;
  Memo2.Lines.Text:=('Reading   '   + IntToStr(dlina)   +   '   bytes');
end;

Эта  процедура нормально работает ,весь входящий пакет выводиться в поле Memo,  но как работать потом с данными находящимися в поле Memo я не знаю. Поэтому хочу разобраться, как данные  входящие в СОМ порт присвоить массиву.
На форме у меня находиться компонент VaComm.   Какую функцию выполняет компонент VaBuffer ?   Ведь у компонента VaComm есть такой параметр как размер буфера , или этот размер и имеет в виду размер буфера VaBuffer, короче запутался я тут совсем.
И ещё мне нужно в поле Memo1  выводить данные полученные из СОМ порта  в НЕХ формате, как это сделать?


EvgenyKorolyuk   (2010-02-15 12:46:00) [1]

Разобрался!!!! Чтобы читать данные с помощью события VaComm1RxBuf нужно поместить на форму VaBuffer1 и связать его с используемым VaComm.
Моя железячка принимает байт (n) и возвращает посылку n,n-1,n-2,...,n (всего n).

procedure TForm1.VaComm1RxBuf(Sender: TObject; Data: PVaData; Count: Integer);
var
 i, n : integer;
begin
//Это число принятых бай. Count работает только до $0E
//а дальше криво. Почему именно $0E, а не $0F хотябы не пойму
n:=VaBuffer1.BufUsed;
//Рисуем число принятых байт
Memo1.Lines.text:=IntToStr(n);
//Лучше дождемся конца посылки, а уже потом
//прочитаем буфер
if n=StrToInt(Edit1.Text)
 then
   begin
//Peek копирует содержимое входящего буфера, не затирая его
//Те потом надо буфер очистить VaBuffer1.Clear
     VaBuffer1.Peek(BufRD[0],n);
//И выводим принятые данные
     for i := 0 to n-1 do
       Memo2.Lines.Text:=Memo2.Lines.Text+IntToStr(BufRD[i]);
   end;

end;


EvgenyKorolyuk   (2010-02-15 09:35:00) [2]

Я вот тоже как раз с этим сижу бъюсь. Только вот это событие VaComm1RxBuf вооще не инициируется!!! Хотя данные приходят. Читаю их пока так:
procedure TForm1.Button4Click(Sender: TObject);
Var i,n: integer;
begin
n:=VaComm1.ReadBufUsed;
//Memo2.Lines.Text:=IntToStr(VaComm1.ReadBufUsed);
if VaComm1.ReadBuf(BufRD[0],n)<>0
then
 begin
   for I := 0 to n-1 do
   Memo2.Lines.Text:=Memo2.Lines.Text+IntToStr(BufRD[i]);
 end
else
 ShowMessage('че то не так!');
end;


MBo   (2010-01-04 19:29:00) [3]

возможно, так:
Move(Data^, Temp, Count)


ZV   (2010-01-04 19:14:00) [4]

Может напишите как ? А я сейчас попробую . Честно говоря я уже так запарился, что без примера не могу разобраться .


MBo   (2010-01-04 17:28:00) [5]

c VaComm не работал, но ведь в RxBuf тебе уже передается Count - количество байт в буфере, и, видимо, указатель на буфер Data - вот оттуда и копируй указанное число байт.


Наверх

Титульная страница Поиск, карта сайта Написать письмо