Главная страница
    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.06 c
15-1275645994
И. Павел
2010-06-04 14:06
2010.08.27
#0 и заголовки окон WinAPI


15-1268859335
Pavia
2010-03-17 23:55
2010.08.27
Внешний жесткий.


15-1268811985
12
2010-03-17 10:46
2010.08.27
Посоветуйте инструмент построения диаграмм БД Oracle


6-1221562776
evgenij
2008-09-16 14:59
2010.08.27
Error от IdFTP


4-1236247314
kalexi
2009-03-05 13:01
2010.08.27
Как определить какую область занимает процесс в памяти.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский