Форум: "Начинающим";
Текущий архив: 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