Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

Компонент 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.062 c
2-1271248525
De:Light
2010-04-14 16:35
2010.08.27
Загрузка и анализ


15-1267447734
Empleado
2010-03-01 15:48
2010.08.27
COMODO AV


15-1263936627
Юрий
2010-01-20 00:30
2010.08.27
С днем рождения ! 20 января 2010 среда


13-1125398405
Cherrex
2005-08-30 14:40
2010.08.27
WIN и VCL


2-1274523488
Delphist2
2010-05-22 14:18
2010.08.27
excel





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский