Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
2 / 2 / 0
Регистрация: 02.03.2012
Сообщений: 66

Функция получения параметров с устройства

24.02.2016, 11:00. Показов 2408. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток! Пишу программу обмена с устройством. Использую компонент BComPort. Посылая команду устройству получаю ответ функцией из описании компонента :
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
procedure TForm1.BComPort1RxChar(Sender: TObject; Count: Integer);
var
  Str: String;
  Stat: PAsync;
  N: Integer;
begin
  InitAsync(Stat);
  try
    BComPort1.ReadStrAsync(Str, Count, Stat);
    repeat
      // Выполнение других действий
    until BComPort1.IsAsyncCompleted(Stat);
    N := BComPort1.WaitForAsync(Stat);
    if N <> Count then SetLength(Str, Count);
  finally
    DoneAsync(Stat);
  end;
  // Действия с переменной Str
end;
Вопрос в том, что хочу сделать одну функцию чтения параметра из устройства в которой бы посылался пакет данных и получал ответ от устройства!
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
function LoadData(addr: string): Double;
var
 crcc,crc,adrwr  : word;
 i,Count     : integer;
 s ,Str1,StrIN    : string;
 bufcrc: array [1..8] of Byte;
 bufIn: array [1..8] of Byte;
begin
 
 buf[0]:= $EE;
 buf[1]:= $00;     
 buf[2]:= $00;     
 buf[3]:= $00;     
 buf[4]:= $01;     // - адрес контроллера
 
 buf[5]:= Trunc(edtCmd.Value);     // - команда
 adrwr:= StrToInt('$'+(addr));
 buf[6]:= HI(adrwr);      // - адрес чтения
 buf[7]:= LO(adrwr);      
 buf[8]:= Trunc(edtCmd.Value);       
 
 for I := 1 to 8 do
 bufcrc[i]:= buf[i];
 crcc:= CRCPascal(bufcrc,8);    // crc
 buf[9]:= lo(crcc); // мл. байт crc
 buf[10]:= hi(crcc);    // ст. байт crc
 BComPort1.Write(buf,11);
 Sleep(500);
 BComPort1.Read(bufIn,Count);
  for I := 0 to Count-1 do begin
  StrIN:= StrIN + ByteToStr(bufIn[i])
  end;
  Mlog.Lines.Add('Tx : '+StrIN);
  for I := 1 to 4 do
  Str1:= Str1 + ByteToStr(bufIn[i]);
  Result:=HexToIEEE754(Str1); 
end;
В результате получаю : Ошибка чтения из порта.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.02.2016, 11:00
Ответы с готовыми решениями:

Программа получения параметров ПК
Здравствуйте, задача - написать программу, которая выводит следующие параметры компьютера: -Тип процессора -Версия операционной системы...

Функция с переменным числом параметров находящая максимальный элемент в списке параметров
Написать функцию с переменным числом параметров:Максимальный из элементов в списке параметров, стоящих на нечетных местах....

Функция с переменным числом параметров, как узнать кличество переданных параметров?
Добрый вечер, можно не использовать int n, а каким то другим способом узнать количество переданных аргументов в функцию и адрес? int suma...

15
24.02.2016, 12:08

Не по теме:

Цитата Сообщение от zurprog Посмотреть сообщение
хочу сделать одну функцию чтения параметра из устройства в которой бы посылался пакет данных и получал ответ от устройства!
За что ты себя так хочешь наказать?

0
2 / 2 / 0
Регистрация: 02.03.2012
Сообщений: 66
24.02.2016, 12:09  [ТС]
В каком смысле? Что не так?
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,612
24.02.2016, 12:11
Цитата Сообщение от zurprog Посмотреть сообщение
Что не так?
Посылка запроса и прием ответа в одном флаконе.
0
2 / 2 / 0
Регистрация: 02.03.2012
Сообщений: 66
24.02.2016, 12:19  [ТС]
Но ведь я создал тему для того, что-бы мне подсказали как лучше сделать, что не так...

Добавлено через 2 минуты
У меня есть адрес параметра, посылая адрес и команду чтения нужно получить ответ в виде числа с плавающей запятой! Этих параметров может быть множество, вот я и хотел использовать одну функцию для того чтобы опрашивать параметры по циклу и получать ответ
0
Хитрая блондиночка $)
 Аватар для Hikari
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
24.02.2016, 12:23
Я могу ошибаться, но по-моему после посыла в порт данных его нужно закрывать, чтоб сообщить получателю что данные пора считывать. И наоборот - при чтении открывать порт, считывать и реагировать на закрыте окончанием считки. Т.е. разделить чтение и запись на последовательные операции.
Пусть спецы поправят меня, если ошибаюсь, но в спецификациях по торговому оборудованию написаны именно такие рекомендации.
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,612
24.02.2016, 12:28
Цитата Сообщение от Hikari Посмотреть сообщение
Я могу ошибаться, но по-моему после посыла в порт данных его нужно закрывать
Ошибаешься.
Цитата Сообщение от zurprog Посмотреть сообщение
вот я и хотел использовать одну функцию для того чтобы опрашивать параметры по циклу и получать ответ
При работе с последовательным портом это садомазохизм.
0
2 / 2 / 0
Регистрация: 02.03.2012
Сообщений: 66
24.02.2016, 13:00  [ТС]
Хорошо! Тогда вопрос! Как правильно сделать опрос параметров устройства?
0
Пишу на Delphi...иногда
 Аватар для cotseec
1423 / 1278 / 286
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
24.02.2016, 19:54
Цитата Сообщение от zurprog Посмотреть сообщение
Как правильно сделать опрос параметров устройства?
варианты:
1. если протокол устройства обеспечивает в ответной квитанции команду, которую ему послали, то при приеме проверять полученную посылку на предмет на какую команду пришел ответ и делать вывод
2. при отправке выставлять некоторый флаг - статус, а снимать его после приема и разбора ответа (в некотором виде машина состояний)

соответственно, имхо, проще все это обернуть в некоторый класс (TDevice) - машину состояний железа
0
2 / 2 / 0
Регистрация: 02.03.2012
Сообщений: 66
24.02.2016, 21:45  [ТС]
Уважаемый cotseec! Я думаю что вы не раз сталкивались с такой задачей и успешно решали ее, но для меня - это пока совсем ничего не понятно! Существует множество библиотек для работы например с весами, в спецификации к которым есть описание функций, например функция подключения к весам или же функция получения веса ! Вот я и хотел примерно такую реализацию!
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,612
25.02.2016, 02:33
Цитата Сообщение от zurprog Посмотреть сообщение
Уважаемый cotseec! Я думаю что вы не раз сталкивались с такой задачей и успешно решали ее, но для меня - это пока совсем ничего не понятно! Существует множество библиотек для работы например с весами, в спецификации к которым есть описание функций, например функция подключения к весам или же функция получения веса ! Вот я и хотел примерно такую реализацию!
Это уже ближе к телу.
Продолжай спрашивать.
0
2 / 2 / 0
Регистрация: 02.03.2012
Сообщений: 66
25.02.2016, 14:37  [ТС]
Цитата Сообщение от northener Посмотреть сообщение
Это уже ближе к телу.
Продолжай спрашивать.
Не понятен ваш ответ!
Были бы еще ответы....

Добавлено через 4 часа 31 минуту
Видимо прошло то время когда помогали на безвозмездной основе....
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
25.02.2016, 15:04
Цитата Сообщение от zurprog Посмотреть сообщение
Были бы еще ответы.
Ты выложил куски какого-то непонятного ни тебе, ни окружающим кода и ждешь, что кто-то напишет тебе готовую программу по работе с каким-то там фигпойми с каким устройством?
Так что ли?
0
2 / 2 / 0
Регистрация: 02.03.2012
Сообщений: 66
25.02.2016, 15:12  [ТС]
П
Цитата Сообщение от FIL Посмотреть сообщение
Ты выложил куски какого-то непонятного ни тебе, ни окружающим
А как по твоему нужно! Нужно заплатить деньги за разработку и выложить исходники что-бы всем было все понятно и все хорошо!
Цитата Сообщение от FIL Посмотреть сообщение
фигпойми с каким устройством
А разница то какая??? Я не прошу расшифровать пакет который вернуло устройство на мою команду! Я задал конкретный вопрос ... Возможно ли в одной функции отправлять команду устройству и получать ответ ...
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
25.02.2016, 16:05
Цитата Сообщение от zurprog Посмотреть сообщение
Возможно ли в одной функции отправлять команду устройству и получать ответ .
Теоретически возможно.
И в хелпе к BComPort все расписано на РУССКОМ языке.
0
132 / 129 / 31
Регистрация: 12.12.2011
Сообщений: 463
26.02.2016, 14:36
Из документации:
Read
Применяется для чтения данных из входного буфера порта в переменную Buffer, размер которой должен быть достаточен для помещения в нее Count байт данных. Функция возвращает управление приложению только после завершения операции чтения или по таймауту (синхронный режим). Возвращаемое значение – количество считанных байт.
Что-то я в LoadData не увидел установки начального значения Count.

Добавлено через 10 минут
Так, для справки, чтобы было яснее что там происходит:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
function TBComPort.Read(var Buffer; Count: Integer): Integer;
var
  AsyncPtr: PAsync;
begin
  InitAsync(AsyncPtr);
  try
    ReadAsync(Buffer, Count, AsyncPtr);
    Result := WaitForAsync(AsyncPtr);
  finally
    DoneAsync(AsyncPtr);
  end;
end;
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function TBComPort.ReadAsync(var Buffer; Count: Integer; var AsyncPtr: PAsync): Integer;
var
  Success: Boolean;
  BytesTrans: DWORD;
begin
  if AsyncPtr = nil then
    raise EComPort.Create(CEMess[5]);
  AsyncPtr^.Kind := okRead;
  Success := ReadFile(FHandle, Buffer, Count, BytesTrans, @AsyncPtr^.Overlapped)
    or (GetLastError = ERROR_IO_PENDING);
  if not Success then
    raise EComPort.Create(CEMess[4]);
  Result := BytesTrans;
end;
Добавлено через 20 часов 15 минут
Кстати, я бы с осторожностью использовал Sleep(); при работе с COM-портом. Судя по документации эта функция остановит выполнение приложения. Поэтому это может породить ошибки приема/передачи, особенно, если чтение и запись в порт вынесены в разные потоки. ИМХО.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.02.2016, 14:36
Помогаю со студенческими работами здесь

Программа для получения параметров ПК
Здравствуйте, есть одна сложная для меня задача - написать программу, которая выводит следующие параметры компьютера: -Тип процессора ...

функция получения массива
// arr из строки файла fl и записи размера получ. массива в перем. size int* getArray(int * arr, FILE * f, int &amp;size) //int&amp;...

Не работает функция получения времени
Здравствуйте. Есть задача:посчитать время работы функции сортировки. Вроде все сделал,сортирует,получает время в первый раз,но второй...

функция получения значения от сервера
Доброго времени суток...Сразу оговорюсь в с# я тугой..Я больше понимаю в делфи, но и там не получилось выполнить задачу....Попросил знакого...

API функция получения системной информации
Помогите, пожалуйста, не понимаю как ее нужно сделать. Выполнить копирование по адресу infnrne значение текущего времени и текущей даты,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru