Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> AsyncFree104 отлов байта, приём побайтно информации с контроллера 
:(
    Опции темы
Darkblue
Дата 22.1.2012, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 20.1.2012

Репутация: нет
Всего: нет



Пишу на делфи 7, использую драйвер AsyncFree104, дк вот мне нужно передавать на контроллер информацию побайтно ну и соответственно он мне должен отвечать (в данный момент просто отправить полученные байты обратно),  как реализовать вылавливание байтов (результат нужен в HEX), посылку делаю следующим образом: задаю в глобальных переменных Buff: byte = ($12);z:integer;  и соответственно на контроллер приходит число  12 hex, параллельно в поле StaticText2.Caption высвечивается число 18 dec, подключал осцил, на нём видно что число приходит с выхода TX
Код

procedure TForm1.BitBtn6Click(Sender: TObject);
begin
AfComPort1.PurgeTX; // очистили выходной буффер
AfComPort1.PurgeRX;
AfComPort1.WriteData(Buff, sizeof(Buff));
z:=Buff;
StaticText2.Caption:=IntToStr(z);
end;


Приём насколько я понял (в интернете вообще почемуто мало инфы о этом драйвере)  можно реализовать так: 
 d1:=AfComPort1.ReadString - не подходит  потому что он переводит данные в  кодировку ASCII а мне нужен HEX а не строка
либо через 
AfComPort1.ReadData
которая должна вызываться  процедурой 
procedure TForm1.AfComPort1DataRecived(Sender: TObject; Count: Integer);
дк вот вопрос:как мне с помощью команды AfComPort1.ReadData отлавливать свои байты? сложность заключается в том, что нет такого компонента AfComPort1DataRecived для помещения его на рабочее поле, а если делать как в коде ниже (причём Buff: byte = ($12); ReadBuffer: array of byte; z,count:integer; задано в глобальных переменных)
Код

procedure TForm1.BitBtn6Click(Sender: TObject);
begin
Poz:=0;
AfComPort1.PurgeTX; // очистили выходной буффер
AfComPort1.PurgeRX;
AfComPort1.WriteData(Buff, sizeof(Buff));
z:=Buff;
StaticText2.Caption:=IntToStr(z);
AfComPort1.ReadData(ReadBuffer[Poz], count);
z:=ReadBuffer[count];
StaticText7.Caption:=IntToStr(z);
end;

то вылазит ошибка Acess violation at address 0049EAA3 in module Project1.exe. Read of address 00000000.

Уважаемые помогите пожалуйста
PM MAIL   Вверх
northener
Дата 22.1.2012, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Цитата(Darkblue @  22.1.2012,  16:38 Найти цитируемый пост)
procedure TForm1.AfComPort1DataRecived(Sender: TObject; Count: Integer);

Это не просто процедура. Это обработчик события OnDataRecieve данного компонента, которое сообщает что принято Count байт. В этом обработчике и нужно вызывать процедуру ReadData.

Это сообщение отредактировал(а) northener - 22.1.2012, 18:25


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Darkblue
Дата 22.1.2012, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 20.1.2012

Репутация: нет
Всего: нет



Извините первый раз юзаю обработчики, тоесть как я понял в ObjectInspector->AFComPort1->Events-> OnDataRecived прописываем ReadData, жмякаем Enter появляется процедура procedure TForm1.ReadData(Sender: TObject; Count: Integer); в которой мы и начинаем считывать наш байт AfComPort1.ReadData(ReadBuffer[Poz], count); ?
PM MAIL   Вверх
northener
Дата 22.1.2012, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



в ObjectInspector->AFComPort1->Events-> OnDataRecived нажимаем Enter или двойной щелчок мышки. Появляется в коде шаблон обработчика TForm1.AfComPort1DataRecived(Sender: TObject; Count: Integer); В нем пишем AfComPort1.ReadData(ReadBuffer[Poz], count); и все прочее что нужно сделать с полученными данными.


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Darkblue
Дата 22.1.2012, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 20.1.2012

Репутация: нет
Всего: нет



Сделал как вы сказали реакций 00,теперь он даже ошибку не выдаёт что мол буфер пуст читать из него нельзя (Acess violation at address 0049EAA3 in module Project1.exe. Read of address 00000000.)
Код

procedure TForm1.ReadData(Sender: TObject; Count: Integer);
begin
AfComPort1.ReadData(ReadBuffer[Poz], count);
Inc(Poz, count);
z:=ReadBuffer[Poz];
StaticText7.Caption:=IntToStr(z);
end;



PM MAIL   Вверх
northener
Дата 22.1.2012, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Цитата(Darkblue @  22.1.2012,  19:26 Найти цитируемый пост)
Read of address 00000000

Что есть ReadBuffer?
Цитата(Darkblue @  22.1.2012,  19:26 Найти цитируемый пост)
Inc(Poz, count);
z:=ReadBuffer[Poz];

Эти две строки нужно поменять местами.


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Darkblue
Дата 22.1.2012, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 20.1.2012

Репутация: нет
Всего: нет



ReadBuffer: array of byte; занесён в глобальные переменные
PM MAIL   Вверх
northener
Дата 22.1.2012, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Цитата(Darkblue @  22.1.2012,  19:37 Найти цитируемый пост)
ReadBuffer: array of byte; занесён в глобальные переменные 

А SetLength(ReadBuffer,...) в коде есть?


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Darkblue
Дата 22.1.2012, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 20.1.2012

Репутация: нет
Всего: нет



Эм нет,в этом ошибка получается,тоесть нужно размер буфера задать ,так? а куда его засунуть до передачи непосредственно? 
Код

procedure TForm1.BitBtn6Click(Sender: TObject);
begin
AfComPort1.PurgeTX; // очистили выходной буффер
AfComPort1.PurgeRX;
AfComPort1.WriteData(Buff, sizeof(Buff));
SetLength(ReadBuffer, Length(ReadBuffer));
z:=Buff;
end;

PM MAIL   Вверх
northener
Дата 22.1.2012, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Цитата(Darkblue @  22.1.2012,  20:31 Найти цитируемый пост)
 а куда его засунуть до передачи непосредственно?

Ну например в FormCreate. Но только не так 
Цитата(Darkblue @  22.1.2012,  20:31 Найти цитируемый пост)
SetLength(ReadBuffer, Length(ReadBuffer));

Пока размер не задан Length(ReadBuffer) вернет 0. 



--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Darkblue
Дата 22.1.2012, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 20.1.2012

Репутация: нет
Всего: нет



Всё разобрался,заработало,огромное вам northene спасибо
PM MAIL   Вверх
northener
Дата 23.1.2012, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Цитата(Darkblue @  22.1.2012,  22:57 Найти цитируемый пост)
огромное вам northener спасибо 

Не за что. Работа с внешним устройством через СОМ-порт - моя родная тематика. А все компоненты для такой работы сделаны практически по одной "кальке" smile

Это сообщение отредактировал(а) northener - 23.1.2012, 00:13


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Darkblue
Дата 24.1.2012, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 20.1.2012

Репутация: нет
Всего: нет



Подскажите пожалуйста ещё. Я отлавливаю байт с порта затем я должен построить 6 графиков в TChart один сдвинут относительно другого, байт=8бит но старшие биты я не использую,код такой
Код

procedure TForm1.Timer2Timer(Sender: TObject);
begin
E := z and 1;                          //Линия1
Series1.AddXY(i2,E+1,'',clRed);   //выделил только первый бит из кадра
E := z and 2;                         //Линия2
E:= E shr 1;                         //выделил только второй бит из кадра
Series2.AddXY(i2,E+3,'',clGreen);
E := z and 4;                         //Линия3
E:= E shr 2;                         //выделил только 3 бит из кадра
Series3.AddXY(i2,E+5,'',clBlue);
E := z and 8;                         //Линия4
E:= E shr 3;                         //выделил только 4 бит из кадра
Series4.AddXY(i2,E+7,'',clYellow);
E := z and 16;                         //Линия5
E:= E shr 4;                         //выделил только 5 бит из кадра
Series5.AddXY(i2,E+9,'',clPurple);
E := z and 32;                         //Линия6
E:= E shr 5;                         //выделил только 6 бит из кадра
Series6.AddXY(i2,E+11,'',clWhite);
inc(i2);
end;

 тоесть построение графика вертится в таймере,минимальное значение срабатывания таймера 1 милисекунда как я понял,как мне сделать правильно ось времени,ведь данные могут приходить намного чаще (56000б/с скорость работы порта выставлена) а минимальное деление оси времени 1 милисекунда?Данные беру с порта
Код

procedure TForm1.AfComPort1DataRecived(Sender: TObject; Count: Integer);
begin
AfComPort1.ReadData(ReadBuffer[Poz], count);       // забрали с порта данные
z:=ReadBuffer[Poz];
AfComPort1.PurgeTX; // очистили выходной буффер
AfComPort1.PurgeRX; // очистили входной буффер!
Poz:=0;               //начальные позиции буфера приёма
count:=0;
end;


PM MAIL   Вверх
northener
Дата 24.1.2012, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Цитата(Darkblue @  24.1.2012,  20:51 Найти цитируемый пост)
минимальное значение срабатывания таймера 1 милисекунда

Увы больше. Как минимумум 10мс с хвостиком.


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Darkblue
Дата 24.1.2012, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 20.1.2012

Репутация: нет
Всего: нет



печально это,но как тогда встроить ось времении правильно в соответствии с временем прихода сигнала? (делаю логический анализатор)
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0937 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.