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

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Принять данные от машины по k-line, т.е. принять их по COM порту и разобрать 
:(
    Опции темы
mr_smit
Дата 18.10.2011, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вобщем вот так всё заработало:
Код

...

else if TesterMode = ReadData then
  begin
    {
      НЕТ ПРОВЕРКИ КОНТРОЛЬНОЙ СУММЫ!!!
    }
    Timer1.Interval:=330;
    AfComPort1.PurgeTX; // очистили выходной буффер
    AfComPort1.PurgeRX;
    CurrentPos:=0;
    AfComPort1.WriteData(readDataByLocalIdentifier, length(readDataByLocalIdentifier));

    Label6.Caption:=IntToStr(40*(StrToInt(IntToStr(ReadBuffer[23]))))+' об/мин';
    Label7.Caption:=IntToStr(StrToInt(IntToStr(ReadBuffer[25])))+' шаг.';
    Label8.Caption:=IntToStr(StrToInt(IntToStr(ReadBuffer[20]))-40)+' град.';
    Label9.Caption:=floatToStrF(5.2+(StrToInt(IntToStr(ReadBuffer[30]))*0.05),ffGeneral,4,2)+' B';
    Label11.Caption:=IntToStr(StrToInt(IntToStr(ReadBuffer[22])))+' %';
    Button1.Enabled:=false;
    Button2.Enabled:=true;
    Button5.Enabled:=true;
  end

...

procedure TForm1.AfComPort1DataRecived(Sender: TObject; Count: Integer);
begin
  AfComPort1.ReadData(ReadBuffer[CurrentPos], Count);
  Inc(CurrentPos, Count);
end;


user posted image

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


Эксперт
***


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

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



Цитата(mr_smit @  18.10.2011,  17:03 Найти цитируемый пост)
northener, спасибо 

Не за что.


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


Опытный
**


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

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



Единственное я не пойму почему запрос ошибок у меня не работает.

Код

...
procedure TForm1.Button5Click(Sender: TObject);
begin
  TesterMode:= ReadError;
end;

...

  else if TesterMode = ReadError then
  begin
    AfComPort1.PurgeTX; // очистили выходной буффер
    AfComPort1.PurgeRX;
    CurrentPos:=0;
    AfComPort1.WriteData(readDTCByStatus, Length(readDTCByStatus));
    Memo1.Clear;

    for i:=0 to ReadBuffer[12]-1 do  // количество ошибок
    begin
      Memo1.Lines.Add('P'+IntToHex(ReadBuffer[j],2)+IntToHex(ReadBuffer[j+1],2));
      j:=j+3;
    end;
    j:=13;
    TesterMode:=ReadData;
  end;
...

Сделал вывод массива на форму. Почему то запрос/ответ на чтение ошибок не проходит. Т.е. после нажатия на кнопку "ошибки" массив не обновляется. И в нем хранятся данные ещё с предыдущего запроса параметров. Странно. Вроде делаю CurrentPos:=0;

user posted image
PM MAIL   Вверх
northener
Дата 19.10.2011, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(mr_smit @  19.10.2011,  09:49 Найти цитируемый пост)
Почему то запрос/ответ на чтение ошибок не проходит. Т.е. после нажатия на кнопку "ошибки" массив не обновляется. И в нем хранятся данные ещё с предыдущего запроса параметров. Странно. Вроде делаю CurrentPos:=0;

В приведенном куске кода есть обнуление CurrentPos. Есть посылка команды WriteData. А где чтение ответа?


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


Опытный
**


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

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



Код

procedure TForm1.AfComPort1DataRecived(Sender: TObject; Count: Integer);
begin
  AfComPort1.ReadData(ReadBuffer[CurrentPos], Count);
  Inc(CurrentPos, Count);
end;

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


Эксперт
***


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

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



Цитата(northener @  19.10.2011,  10:45 Найти цитируемый пост)
В приведенном куске кода есть обнуление CurrentPos. Есть посылка команды WriteData. А где чтение ответа? 


Цитата(mr_smit @  19.10.2011,  20:36 Найти цитируемый пост)
procedure TForm1.AfComPort1DataRecived(Sender: TObject; Count: Integer);
begin
  AfComPort1.ReadData(ReadBuffer[CurrentPos], Count);
  Inc(CurrentPos, Count);
end;


Так. Я тогда не понимаю, чему вы радовались в 
Цитата(mr_smit @  18.10.2011,  17:03 Найти цитируемый пост)
Вобщем вот так всё заработало:
?
И за что вы мне плюсик дали?

Смотрим ваш кусок кода:
Код

else if TesterMode = ReadError then
  begin
    AfComPort1.PurgeTX; // очистили выходной буффер
    AfComPort1.PurgeRX;
    CurrentPos:=0;
    AfComPort1.WriteData(readDTCByStatus, Length(readDTCByStatus)); [I][color=blue]<---Вот тут вы посылаете запрос железяке.[/color][/I]
    Memo1.Clear;
    for i:=0 to ReadBuffer[12]-1 do  // количество ошибок  [I][color=blue]<---А тут, в цикле, уже выводите данные из вашего приемного буфера в Мемо! И что вы надеятесь увидеть в данный момент в вашем приёмном буфере?  Да. После вызова метода компонента WriteData, компонент запустил свой механизм по передаче драйверу СОМ-порта данных для выдачи на линию. Плюс запустил в отдельном потоке функцию WaitCommEvent для получения события о том, что драйвер СОМ-порта что-то прочитал. И возможно даже драйвер уже успел что-то прочитать и сообщить об этом компоненту. Но ваша программа не сможет НИЧЕГО об этом узнать до выхода из той процедуры, кусок которой вы привели! Ибо пока вы не вышли из этой процедуры вашей программы, ваша программа не сможет обработать событие компонента ReadData[/color][/I]
    begin
      Memo1.Lines.Add('P'+IntToHex(ReadBuffer[j],2)+IntToHex(ReadBuffer[j+1],2));
      j:=j+3;
    end;
    j:=13;
    TesterMode:=ReadData;
  end;


Добавлено через 13 минут и 27 секунд
То ли лыжи не едут, то ли я ...
Привожу полностью тот мой комментарий к коду, который начинался словами "А тут, в цикле, вы выводите из вашего приемного..."
А тут, в цикле, уже выводите данные из вашего приемного буфера в Мемо! И что вы надеетесь увидеть в данный момент в вашем приёмном
 буфере?  Да. После вызова метода компонента WriteData, компонент запустил свой механизм по передаче драйверу СОМ-порта данных для
 выдачи на линию. Плюс запустил в отдельном потоке функцию WaitCommEvent для получения события о том, что драйвер СОМ-порта что-то
 прочитал. И возможно даже драйвер уже успел что-то прочитать и сообщить об этом компоненту. Но ваша программа не сможет
 НИЧЕГО об этом узнать до выхода из той процедуры, кусок которой вы привели! Ибо пока вы не вышли из этой процедуры вашей
 программы, ваша программа не сможет обработать событие компонента ReadData.



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


Опытный
**


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

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



Плюс поставил за кусок кода:
Код

procedure TForm1.AfComPort1DataRecived(Sender: TObject; Count: Integer);
begin
  AfComPort1.ReadData(ReadBuffer[CurrentPos], Count);
  Inc(CurrentPos, Count);
end;


В принципе я думал  что просто не успевает массив заполнится данными. Но в режиме реального времени параметры у меня отображаются. Таймер настроен на 330 мс. Т.е. 3 раза в секунду считываю параметры.

А как тогда тут поступить со считыванием ошибок по нажатию кнопки? Добавить как то задержку? Или 2 раза запрашивать?

Почему когда я считываю данные - массив успевает обновляться, а когда ошибки считываю таким же образом, то массив не обновляется.

Это сообщение отредактировал(а) mr_smit - 20.10.2011, 01:27
PM MAIL   Вверх
northener
Дата 20.10.2011, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(mr_smit @  20.10.2011,  01:02 Найти цитируемый пост)
Но в режиме реального времени параметры у меня отображаются.


Цитата(mr_smit @  20.10.2011,  01:02 Найти цитируемый пост)
А как тогда тут поступить со считыванием ошибок по нажатию кнопки?


Приведите код вашей процедуры OnTimer. Я подскажу как её изменить.

Тогда хоть я смогу (если смогу), хоть как-то отработать тот плюсик, который вы мне добавили. :(

Это сообщение отредактировал(а) northener - 21.10.2011, 01:04


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


Опытный
**


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

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



Вот:

Присоединённый файл ( Кол-во скачиваний: 44 )
Присоединённый файл  Unit1.pas 6,04 Kb
PM MAIL   Вверх
Korod
Дата 24.10.2011, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



На СОМ-портах персоналки -12в - это лог.1, а +12в - это лог.0.
PM MAIL   Вверх
northener
Дата 24.10.2011, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(mr_smit @  21.10.2011,  08:05 Найти цитируемый пост)
Вот: 

Чтобы не захламлять форум, ответил в личку.


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


Новичок



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

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



Уважаемые подскажите пожалуйста procedure TForm1.AfComPort1DataRecived ставится на рабочее поле,или просто прописывается в процедурах. Никак не могу научиться байт ловить ,помогите пожалуйста
PM MAIL   Вверх
bems
Дата 20.1.2012, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

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




M
bems
Один топик — один вопрос!

Пожалуйста, ознакомьтесь с правилами форума.




Тема закрыта. Создайте по одной теме для каждого интересующего вас вопроса.



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Страницы: (3) Все 1 2 [3] 
Закрытая темаСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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