Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 21.09.2021
Сообщений: 23

Работа с COM-портом

22.09.2021, 08:37. Показов 3611. Ответов 63
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Имеется такая задача: получать данные с com порта и строить графики от полученных данных. Это удалось реализовать, но происходит запаздывание, т.к. таймер не даёт делать опрос чаще, чем нужно. Как увеличить быстродействие опроса?
Как сейчас у меня это реализовано:
Delphi
1
2
3
4
5
6
7
8
procedure TForm2.Timer1Timer(Sender: TObject);
var
  D1 := Form1.a[5] + Form1.a[6] + Form1.a[7] + Form1.a[8];
  val : double;
  hi := hi+1;
  val := StrToFloat(StringReplace(D1, '.', ',', [rfReplaceAll, rfIgnoreCase]));
  Series1.AddXY(hi,val,'',clred);
end;
Интервал у таймера выставлен 1, меньше не даёт.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.09.2021, 08:37
Ответы с готовыми решениями:

Работа с COM-портом...
Добрый вечер, люди добрые! Помогите пожалуйста разобраться. Нужно мне подключить датчик пожарной сигналки к компорту(только теоритически,...

Работа с COM-портом
Ребят, помогите, пожалуйста, сделать работу с 7 COM-портом, вывести на него 12 вольт, чтобы заработало подключенное к нему реле. просто...

Работа с Портом RS232
Народ подскажите книгу где есть информация по работе с портом RS232 с помощю Делфи. Зарание спасибо.

63
 Аватар для Xp_1337
3 / 3 / 0
Регистрация: 20.08.2021
Сообщений: 75
24.09.2021, 11:33
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Verevkin Посмотреть сообщение
Чо это значит - "играться"?
Ну настраивать её под себя
0
Злостный нарушитель
 Аватар для Verevkin
10912 / 5840 / 1289
Регистрация: 12.03.2015
Сообщений: 26,940
24.09.2021, 11:37
Цитата Сообщение от Xp_1337 Посмотреть сообщение
Ну настраивать её под себя
Это было возможно ВСЕГДА.
0
Модератор
 Аватар для D1973
9959 / 6495 / 2461
Регистрация: 21.01.2014
Сообщений: 27,505
Записей в блоге: 3
24.09.2021, 15:38
Собственно, даже Turbo Pascal это позволял... Совсем это удивление мне не понятно...
0
Злостный нарушитель
 Аватар для Verevkin
10912 / 5840 / 1289
Регистрация: 12.03.2015
Сообщений: 26,940
24.09.2021, 15:46
Цитата Сообщение от D1973 Посмотреть сообщение
Собственно, даже Turbo Pascal это позволял...
Ууууууууууу, моя прелесть!

0
0 / 0 / 0
Регистрация: 21.09.2021
Сообщений: 23
27.09.2021, 10:08  [ТС]
В общем, после попыток манипуляций получилось.. Ничего. При запуске потока данные с компорта взяты один раз, но их обновление не происходит, соответственно график рисует прямую линию, т.к. не фиксирует изменений, а счётчик работает. При нажатии кнопки для остановки потока, программа валится с ошибкой. Код:
Запуск второй формы с графиками:
Delphi
1
2
3
4
5
6
procedure TForm1.Button1Click(Sender: TObject);
begin
  if (not Assigned(Form2)) then
    Form2:=TForm2.Create(Self);
  Form2.ShowModal;
end;
Запуск потока:
Delphi
1
2
3
4
5
6
procedure TForm2.Button1Click(Sender: TObject);
begin
  Series1.clear;
  MyThread:=TMyThread.Create(False);
  MyThread.Priority:=tpNormal;
end;
Поток:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TMyThread.Execute;
begin
  while not Terminated do begin
    hi := hi+1;
  if Length(Form1.a) = 245 then begin
    Form2.Memo1.Lines.Add(Form1.a);
    D1 := Form1.a[5] + Form1.a[6] + Form1.a[7] + Form1.a[8];
  end;
  val := StrToFloat(StringReplace(D1, '.', ',', [rfReplaceAll, rfIgnoreCase]));
  Form2.Chart1.MaxPointsPerPage := 200;
  Form2.Chart1.NextPage;
  Form2.Series1.AddXY(hi,val,'',clred);
  Synchronize(DoSync);
  end;
end;
Метод синхронизации:
Delphi
1
2
3
4
procedure TMyThread.DoSync;
begin
  Form2.Caption := IntToStr(Random(1000));
end;
По примерам, представленным здесь, вызывать синхронизацию надо по какому либо условию, я так понимаю, но вот какое условие использовать - не знаю. Сейчас при запуске потока в мемо вижу, что переменная a не меняется, поток данных как будто зафиксирован один и тот же, и он не меняется. Также на графике рисуется прямая линия. Ошибка при остановке потока:
Кликните здесь для просмотра всего текста
Миниатюры
Работа с COM-портом  
0
0 / 0 / 0
Регистрация: 21.09.2021
Сообщений: 23
27.09.2021, 10:12  [ТС]
А вот так выглядит сама форма 2

Не по теме:

Да простят меня модераторы и софорумчане, за то что не знаю как тут правильно картинки размещать

Миниатюры
Работа с COM-портом  
0
Злостный нарушитель
 Аватар для Verevkin
10912 / 5840 / 1289
Регистрация: 12.03.2015
Сообщений: 26,940
27.09.2021, 10:14
Цитата Сообщение от WinKarbik Посмотреть сообщение
При нажатии кнопки для остановки потока, программа валится с ошибкой.
Да ты задолбал лезть в VCL из побочного треда. Ты чо, не читал то, что мы тебе выше написали?
0
0 / 0 / 0
Регистрация: 21.09.2021
Сообщений: 23
27.09.2021, 10:17  [ТС]
Цитата Сообщение от Verevkin Посмотреть сообщение
Ты чо, не читал то, что мы тебе выше написали?
Я как раз прочитал, и сделал по твоему примеру. Что я сделал не так?
0
Злостный нарушитель
 Аватар для Verevkin
10912 / 5840 / 1289
Регистрация: 12.03.2015
Сообщений: 26,940
27.09.2021, 10:21
Цитата Сообщение от WinKarbik Посмотреть сообщение
Что я сделал не так?
Вот это:
0
Модератор
4156 / 2365 / 814
Регистрация: 15.11.2015
Сообщений: 9,503
27.09.2021, 10:21
Цитата Сообщение от WinKarbik Посмотреть сообщение
Метод синхронизации:
Delphi
1
2
3
4
procedure TMyThread.DoSync;
begin
 Form2.Caption := IntToStr(Random(1000));
end;

Это был просто пример с Random() для демонстрации работы! Нужно вот вместо этого Caption сюда внести код работы с Chart, потому, что Chart1 это тоже визуальный компонент VCL.
0
0 / 0 / 0
Регистрация: 21.09.2021
Сообщений: 23
27.09.2021, 10:29  [ТС]
Цитата Сообщение от AzAtom Посмотреть сообщение
Chart1 это тоже визуальный компонент VCL.
Об этом я уже тоже подумал. Пробовал засунуть рисование в DoSync, но это не поменяло ситуацию.

Добавлено через 5 минут
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
procedure TMyThread.DoSync;
begin
  val := StrToFloat(StringReplace(D1, '.', ',', [rfReplaceAll, rfIgnoreCase]));
  Form2.Chart1.MaxPointsPerPage := 200;
  Form2.Chart1.NextPage;
  Form2.Series1.AddXY(hi,val,'',clred);
end;
 
procedure TMyThread.Execute;
begin
  while not Terminated do begin
    if Length(Form1.a) = 245 then begin
      Form2.Memo1.Lines.Add(Form1.a);
      D1 := Form1.a[5] + Form1.a[6] + Form1.a[7] + Form1.a[8];
    end;
    hi := hi+1;
    Synchronize(DoSync);
  end;
end;
Вот так вот сделал, также ничего не поменялось
0
Модератор
4156 / 2365 / 814
Регистрация: 15.11.2015
Сообщений: 9,503
27.09.2021, 10:32
WinKarbik, а в чём смысл конкретно этого потока? Он с портом не работает, а просто добавляет содержимое массива с Form1 на Chart на форме Form2. Тут поток не нужен.
0
Злостный нарушитель
 Аватар для Verevkin
10912 / 5840 / 1289
Регистрация: 12.03.2015
Сообщений: 26,940
27.09.2021, 10:32
Цитата Сообщение от WinKarbik Посмотреть сообщение
Вот так вот сделал, также ничего не поменялось
Прросто сделай так, чтобы тред не имел никакого отношения к форме и всему, что на ней находится.
Убери компонент TComPortDriver с формы, создавай/убивай его внутри треда, назначь ему обработчиком события метод самого треда и отрисовывай синхронно только принятые данные.
0
Модератор
4156 / 2365 / 814
Регистрация: 15.11.2015
Сообщений: 9,503
27.09.2021, 10:33
Цитата Сообщение от WinKarbik Посмотреть сообщение
Form2.Memo1.Lines.Add(Form1.a);
Memo тоже визуальный компонент VCL и тоже нуждается в синхронизации.
0
0 / 0 / 0
Регистрация: 21.09.2021
Сообщений: 23
27.09.2021, 10:39  [ТС]
Цитата Сообщение от AzAtom Посмотреть сообщение
а в чём смысл конкретно этого потока?
Суть программы такова: с микроконтроллера приходит значение напряжения с 9 датчиков. В первой форме подключение/отключение к ком порту(возможно будет что-то ещё, пока не придумал), кнопка графики. При нажатии на кнопку графики открывается вторая форма, в которой две кнопки - начать рисовать и остановить. Для начала я реализовывал отрисовывание графиков в таймере, но там минимальная задержка 0,001с, играясь датчиком, компьютер не успевает обработать данные, поэтому вместо таймера решил использовать поток. Или тут можно как то подругому для увеличения быстродействия, по сравнению с таймером?

Добавлено через 27 секунд
Цитата Сообщение от AzAtom Посмотреть сообщение
Memo тоже визуальный компонент VCL
Это да, чуть позже заметил, перенёс его, тоже не помогло. Но программа перестала вылетать, если таскать её окошко.
0
Модератор
4156 / 2365 / 814
Регистрация: 15.11.2015
Сообщений: 9,503
27.09.2021, 10:48
Цитата Сообщение от WinKarbik Посмотреть сообщение
таймере, но там минимальная задержка 0,001с
Нет, у стандартного системного таймера минимальное разрешение около 16 мс и увеличивается тоже с шагом примерно в 16 мс, хоть там и задаются значения с точностью в 1 мс.

Цитата Сообщение от WinKarbik Посмотреть сообщение
компьютер не успевает обработать данные, поэтому вместо таймера решил использовать поток.
Если компьютер именно не успевает, то есть, загрузка процессора 100%, то поток вряд ли поможет. Надо дальше думать.

Я так плотно не работал с TChart, но возможно просто он медленный. Можно попробовать самостоятельно рисовать график на Image, например. Думаю, попробовать стоит.
0
0 / 0 / 0
Регистрация: 21.09.2021
Сообщений: 23
27.09.2021, 11:06  [ТС]
Цитата Сообщение от AzAtom Посмотреть сообщение
Если компьютер именно не успевает, то есть, загрузка процессора 100%, то поток вряд ли поможет. Надо дальше думать.
В теории компьютер как раз должен успевать. Микроконтроллер 72МГц, компьютер 2.7ГГц, таймер с частотой 1мс обеспечивает 1000Гц(или 10000Гц? Запутался, но явно меньше, чем МК), соответственно если у датчика резко скакнуло напряжение и упало обратно, компьютер нарисует прямую линию, т.к. он не успел поймать изменение, да и если у датчика упало напряжение, то компьютер выдаст это не сразу, а с задержкой 1-2сек. Это всё было так в таймере, поэтому думаю и применить поток.
0
Злостный нарушитель
 Аватар для Verevkin
10912 / 5840 / 1289
Регистрация: 12.03.2015
Сообщений: 26,940
27.09.2021, 11:06
Цитата Сообщение от AzAtom Посмотреть сообщение
Если компьютер именно не успевает, то есть, загрузка процессора 100%, то поток вряд ли поможет. Надо дальше думать.
Да хтож так делает?
Надо в треде накапливать массив принятых данных, а вот график строить как раз по таймеру, отрисовывая за раз всё то, что было накоплено на один тик таймера.
TChart работает очень быстро (в умелых руках) и переваривает большие кучи точек за единицу времени.
0
0 / 0 / 0
Регистрация: 21.09.2021
Сообщений: 23
27.09.2021, 11:12  [ТС]
Цитата Сообщение от Verevkin Посмотреть сообщение
Надо в треде накапливать массив принятых данных, а вот график строить как раз по таймеру
Т.е. в потоке я ком порт читаю, присваиваю переменным значения, а в таймере рисую графики?
0
Злостный нарушитель
 Аватар для Verevkin
10912 / 5840 / 1289
Регистрация: 12.03.2015
Сообщений: 26,940
27.09.2021, 11:22
Цитата Сообщение от WinKarbik Посмотреть сообщение
Т.е. в потоке я ком порт читаю, присваиваю переменным значения, а в таймере рисую графики?
не совсем так.
В треде ты принимаешь данные, идущие из порта, и складываешь их в одноразовый динамический буфер. Как только прошло Х миллисекунд, ты генеришь синхронное событие, в котором отдаёшь форме этот буфер на копирование, а затем продолжаешь собирать данные в новый буфер, пока VCL рисует твой график.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.09.2021, 11:22

Работа с ком портом
Все еще раз привет. Подскажите как можно поправить код, чтобы вывод был без задержек и слетевших строк в memo. Если в терминале ...

Работа с виртуальным com-портом
Пишу программу, которая передает и принимает данные с устройства через виртуальный com-порт (USB). Проблема следующая - вот фрагмент...

Delphi 10.1 Berlin работа с COM портом
Здравствуйте, друзья! Давненько мне не приходилось работать с Делфи, но жизнь опять заставляет. :scratch: Задача очень проста, нужно...

работа с COM портом
помогите, пожалуйста, наладить правильную работу с COM- портом. У меня есть аналогово-цифровой преобразователь, который преобразует...

Работа с COM Портом
Привет Всем! У меня тут такая проблема. Для работы с одним внешним устройством, которое заведомо неопределенным образом выдает сигналы...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru