Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

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

 
ZV ©   (2010-01-04 16:42) [0]

В СОМ порт приходят данные (пакет  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  выводить данные полученные из СОМ порта  в НЕХ формате, как это сделать?


 
MBo ©   (2010-01-04 17:28) [1]

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


 
ZV ©   (2010-01-04 19:14) [2]

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


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

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


 
EvgenyKorolyuk ©   (2010-02-15 09:35) [4]

Я вот тоже как раз с этим сижу бъюсь. Только вот это событие 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;


 
EvgenyKorolyuk ©   (2010-02-15 12:46) [5]

Разобрался!!!! Чтобы читать данные с помощью события 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;




Страницы: 1 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.069 c
2-1268482467
Первокурсница
2010-03-13 15:14
2010.08.27
Контроль превышения размера числа


15-1270812348
dars73
2010-04-09 15:25
2010.08.27
Как настроить локализацию


15-1263914019
TUser
2010-01-19 18:13
2010.08.27
СШ ГЭС: обледенение


2-1269796732
fiascko
2010-03-28 21:18
2010.08.27
построение графиков


2-1271431396
Nikru
2010-04-16 19:23
2010.08.27
WebBrowser