0 / 0 / 0
Регистрация: 05.10.2023
Сообщений: 116

Работа с ComPort

05.10.2023, 16:03. Показов 6749. Ответов 149
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, работаю с ComPort и хочу передать данные через Writeport. Столкнулась с такой проблемой, что при вызове функции OutputBuffer заполнен, а когда перехожу по дебагу, то в этой функции значение буфера=no value (размер вычислился и передался).
Почему буфер не передался?

Вообще для чего мне это надо. Мне надо принять данные со сторонней программы подключенное к ComPort . Как я понимаю для того,чтобы принять, мне надо сигнализировать,что принимаю. Поэтому изначально использую Writeport.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.10.2023, 16:03
Ответы с готовыми решениями:

Асинхронная работа с ComPort
Приветствую великих умов форума, столкнулся с проблемой работы с comPort, а конкретнее я использую модем который поддерживает ComPort и вот...

Работа с ComPort Library
Здравствуйте, помогите разобраться, кое в чем с компонентой ComPort Library 3.10 . Проблема такова, есть устройство соединенное с ПК через...

RS-232 ComPort
Не знал куда задать вопрос задал здесь, извиняюсь конечно что ни туда залез я не программист просто возникла одна проблема, которое...

149
0 / 0 / 0
Регистрация: 05.10.2023
Сообщений: 116
13.11.2023, 18:53  [ТС]
Студворк — интернет-сервис помощи студентам
Beltar, да просто сказали,что нужно выбирать порт. Я думала,что с таймером так же будет как и с обрывом, а тут нет. И уже подумала мало ли есть еще неочевидные вещи с таймером.
0
 Аватар для Beltar
1074 / 514 / 41
Регистрация: 05.05.2022
Сообщений: 3,669
13.11.2023, 19:06
Покажите проект, хотя бы на уровне скелета, нажать кнопку, чтобы открыть\закрыть порт, нажать другую, чтобы послать запрос. В идеале вообще неплохо иметь отдельную прогу чисто для тестирования оборудования.
0
0 / 0 / 0
Регистрация: 05.10.2023
Сообщений: 116
13.11.2023, 19:16  [ТС]
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
procedure TFormConnection.ButtonDataOutputClick(Sender: TObject);
var
  ErrorCode: Integer;
  Size, command, ChoiceChannel: Short;
  i: Integer;
  OutputBuffer: Integer;
  InputBuffer: Byte;
  Str: string;
  A: real;
  t: string;
  myDate: TDateTime;
  SqlPar: string;
  MyArray: array [0 .. 7] of Short;
begin
  ErrorCode := WritePort(command, 1);
  if ErrorCode = -1 then
    MessageDlg('Ошибка отправки', MtWarning, [mbOK], 0);
  SqlPar := Choice(ChoiceCommand);
  TimerRead.Enabled := true;
  i := 0;
  While sizeAnswer > 0 do
  begin
    ErrorCode := ReadPort(InputBuffer, SizeOf(InputBuffer));   // одно и тоже. тут и зависает
    if TimerRead.Enabled = false  then
     exit;
    MyArray[i] := InputBuffer;
    Dec(sizeAnswer);
    Inc(i);
  end;
 
  if ErrorCode = -1 then
    MessageDlg('Сделайте подключение или проверьте запущен ли сервер',
      mtInformation , [mbOK], 0);


Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
function TFormConnection.ReadPort(var Buf; Size: Word): Integer;
var
  i: cardinal;
  ovr: TOverlapped;
begin
  FillChar(Buf, Size, 0);
  FillChar(ovr, SizeOf(ovr), 0);
  i := 0;
  Result := -1;
  if (not ReadFile(ComFile, Buf, Size, i, @ovr)) then
    exit;
  Result := i;
end;

Delphi
1
2
3
4
procedure TFormConnection.TimerReadTimer(Sender: TObject);
begin
  TimerRead.Enabled:= false;
end;
у меня виртуальное соединение по портам,так и тестирую
0
 Аватар для Beltar
1074 / 514 / 41
Регистрация: 05.05.2022
Сообщений: 3,669
13.11.2023, 19:35
Где порт открывается? Вообще скидайте это все в отдельный проект.

А вообще, если на то пошло, то что мешает после записи подождать полсекунды и прочитать порт? За это время все данные должны собраться в буфере порта. Или не прийти уже никогда. Для опроса больших полевых сетей - это не вариант, там таймауты - это беда и не отвечающих могут просто исключать из опроса на время. Но для разовой операции фигня.

Если честно я вообще не понимаю, как у вас чтение вообще хоть 1 байт успевает прочитать, т. к. код чтения должен выполниться задолго до того, как вам ответит устройство. И как сохраняется позиция в приемном буфере.
0
0 / 0 / 0
Регистрация: 05.10.2023
Сообщений: 116
13.11.2023, 19:49  [ТС]
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TFormConnection.FormCreate(Sender: TObject);
Var
  i: Integer;
begin
  for i := 0 to 10 do
  begin
    ComFile := CreateFile(Pchar('COM' + intToStr(i + 1)), GENERIC_READ or
      GENERIC_WRITE, 0, nil, open_existing, file_flag_overlapped, 0);
    if ComFile <> INVALID_HANDLE_VALUE then
    begin
      ListBox1.Items.Add('COM' + intToStr(i + 1));
      CloseHandle(ComFile);
    end;
  end;
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
procedure TFormConnection.ButtonInterconnectionClick(Sender: TObject);
begin
  W := ListBox1.Items.Strings[ListBox1.ItemIndex];
  Adr := PWideChar(W);
  ComFile := CreateFile(Pchar(Adr), GENERIC_READ or GENERIC_WRITE,
    FILE_SHARE_READ, nil, CREATE_ALWAYS, 0, 0);
  if ComFile = INVALID_HANDLE_VALUE then
  begin
    ShowMessage('Не удалось открыть порт!');
    exit;
  end
  else
  begin
    MessageDlg('Подключено', mtInformation , [mbOK], 0);
  end;
  SetupComm(ComFile, 4096, 4096);
  FormConnection.ComboBoxList.Visible := true;
  GetCommState(ComFile, DCB);
  with DCB do
  begin
    BaudRate := 9600;
    ByteSize := 8;
    Parity := EvenParity;
    StopBits := OneStopBit;
  end;
 
  if not SetCommState(ComFile, DCB) then
  begin
    ShowMessage('Порт не настроен');
    CloseHandle(ComFile);
    exit;
  end;
end;
0
 Аватар для Beltar
1074 / 514 / 41
Регистрация: 05.05.2022
Сообщений: 3,669
13.11.2023, 20:31
Выложите просто проект, вы думаете это так просто расставлять руками контролы и копировать кучу функций. WritePort вы так и не выложили.

Если у вас там еще работа с БД, то сделайте копию и уберите все лишнее, чтобы компилировался.

Ваша задача сделать сначала что-то подобное. А уже потом делать основной рабочий софт. И открытый порт на скрине, скорее всего, даже не распаян на материнской плате. Т. е. наличие порта в системе вообще никакой информационной ценности не несет.
Миниатюры
Работа с ComPort  
1
 Аватар для Beltar
1074 / 514 / 41
Регистрация: 05.05.2022
Сообщений: 3,669
14.11.2023, 15:35
А вообще если бы делали даже на голом API через отдельный поток, посылающий основному сообщение о приходе данных, то вопрос бы уже закрыли.
0
пофигист широкого профиля
4770 / 3207 / 862
Регистрация: 15.07.2013
Сообщений: 18,615
15.11.2023, 01:47
Цитата Сообщение от Beltar Посмотреть сообщение
А вообще если бы делали даже на голом API через отдельный поток, посылающий основному сообщение о приходе данных, то вопрос бы уже закрыли.
Вы не сказали как именно это делать на "голом API". А ссылку на статью где всё это грамотно реализовано я уже давал в посте #135
0
 Аватар для Beltar
1074 / 514 / 41
Регистрация: 05.05.2022
Сообщений: 3,669
15.11.2023, 06:43
Я выкладывал проект утилитки для обмена м/у 2 портами, скорее всего, я его делал на основе именно этой статьи. Тогда именно Delphikingdom был основным источником инфы.
0
0 / 0 / 0
Регистрация: 05.10.2023
Сообщений: 116
15.11.2023, 08:29  [ТС]
Ребята,спасибо большое
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.11.2023, 08:29

Delphi Comport
Добрый вечер Использую библиотеку CPortLib Два компонента ComPort и ComDataPacket ComPort виртуальный устройство (Arduino UNO)...

Не читает с ComPort
Добрый день, форумчане! Помогите, пожалуйста! Не могу считать с компорта. Затыкается на чтении, хотя терминал показывает, что данные...

Comport vs Delphi
Вечер в хату! Хочу спросить в 100500-й раз)) Есть прога на Delphi, есть Arduino. Скетч Arduino void setup() { ...

PHP+ComPort
Добрый день всем, как можно отправить сообщения на компорт через php ?, в интернете поискал нашел примеры `mode com1: BAUD=9600...

Переназначить comport
Здравствуйте. Имеется клиент-серверное приложение, без возможности смены comport'а... Возможно ли программно переназначить comport...


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

Или воспользуйтесь поиском по форуму:
150
Ответ Создать тему
Опции темы

Новые блоги и статьи
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru