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

Работа с ComPort

05.10.2023, 16:03. Показов 6583. Ответов 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
1071 / 512 / 41
Регистрация: 05.05.2022
Сообщений: 3,603
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
1071 / 512 / 41
Регистрация: 05.05.2022
Сообщений: 3,603
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
1071 / 512 / 41
Регистрация: 05.05.2022
Сообщений: 3,603
13.11.2023, 20:31
Выложите просто проект, вы думаете это так просто расставлять руками контролы и копировать кучу функций. WritePort вы так и не выложили.

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

Ваша задача сделать сначала что-то подобное. А уже потом делать основной рабочий софт. И открытый порт на скрине, скорее всего, даже не распаян на материнской плате. Т. е. наличие порта в системе вообще никакой информационной ценности не несет.
Миниатюры
Работа с ComPort  
1
 Аватар для Beltar
1071 / 512 / 41
Регистрация: 05.05.2022
Сообщений: 3,603
14.11.2023, 15:35
А вообще если бы делали даже на голом API через отдельный поток, посылающий основному сообщение о приходе данных, то вопрос бы уже закрыли.
0
пофигист широкого профиля
4770 / 3206 / 862
Регистрация: 15.07.2013
Сообщений: 18,613
15.11.2023, 01:47
Цитата Сообщение от Beltar Посмотреть сообщение
А вообще если бы делали даже на голом API через отдельный поток, посылающий основному сообщение о приходе данных, то вопрос бы уже закрыли.
Вы не сказали как именно это делать на "голом API". А ссылку на статью где всё это грамотно реализовано я уже давал в посте #135
0
 Аватар для Beltar
1071 / 512 / 41
Регистрация: 05.05.2022
Сообщений: 3,603
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
Ответ Создать тему
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru