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

Работа с ComPort

05.10.2023, 16:03. Показов 6598. Ответов 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
 Аватар для Beltar
1071 / 512 / 41
Регистрация: 05.05.2022
Сообщений: 3,603
09.10.2023, 12:57
Студворк — интернет-сервис помощи студентам
А что, функцию IntToHex отменили? Вот насчет побитового вывода не знаю, есть ли готовая, но можно самостоятельно сделать с помощью операций or и shr\shl.

Цитата Сообщение от OdinNastya Посмотреть сообщение
Мне по Com port надо передать hex команду.

Комп только в двоичной системе работает и передает.
0
0 / 0 / 0
Регистрация: 05.10.2023
Сообщений: 116
09.10.2023, 13:14  [ТС]
Цитата Сообщение от Beltar Посмотреть сообщение
Комп только в двоичной системе работает и передает.
это понятно.

Но из-за того, что у меня
Delphi
1
function ReadPort(var Buf :  integer; Size: Word): Integer;
Buf : integer
оно сразу в dec.
Так мне тип другой сделать или как вы говорите функцию преобразования сделать?
для меня лучше с исходником Bin работать.
0
0 / 0 / 0
Регистрация: 05.10.2023
Сообщений: 116
09.10.2023, 13:30  [ТС]
Если я делаю не integer, а
Delphi
1
2
3
4
InputBuffer: array [0..16] of Char;  // приёмный буфер
ErrorCode: integer;
begin
  ErrorCode:= ReadPort(InputBuffer, Length(InputBuffer));  // приём пакета
то программа зависает, так как в буфере
Миниатюры
Работа с ComPort  
0
0 / 0 / 0
Регистрация: 05.10.2023
Сообщений: 116
09.10.2023, 14:00  [ТС]
Скорее всего надо, чтобы приемный буфер был
Delphi
1
array [0..15] of Char;
Сейчас у меня код:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure TForm1.Button3Click(Sender: TObject);
var
  InputBuffer: array [0..15] of Char;  // приёмный буфер
  ErrorCode: integer;
 
begin
  ErrorCode:= ReadPort(InputBuffer, Length(InputBuffer));  // приём пакета
  if ErrorCode = -1 then MessageDlg('Ошибка приёма пакета', MtWarning, [mbOK], 0)
  else
  begin
    Form1.Memo1.Lines.Add(InputBuffer);
    MessageDlg('Порт прочитан', MtConfirmation, [mbOK], 0);
    end;
end;
Само чтение
Delphi
1
2
3
4
5
6
7
8
9
10
11
function TForm1.ReadPort(var Buf :  Array of Char; 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;
И все. У меня зависает.
0
 Аватар для Beltar
1071 / 512 / 41
Регистрация: 05.05.2022
Сообщений: 3,603
09.10.2023, 14:00
Она вам что передает? Числа в двоичном формате, или в текстовом? Других опций нет. Нет никаких Hex-команд, если только у вас там не какой-то строковый протокол, а на принимающей стороне строковый парсер.

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

Вы хотите набрать побайтно посылку в виде Hex значений, и отправить в порт? Тогда надо эти байты в массив Byte'ов переводить.

Это очень старый проект на основе старого юнита для работы COM-портом, который просто позволяет прослушивать приходящее в порт или гонять данные м/у двумя портами, в т. ч. байтовые посылки записанные в Hex-виде. Я тогда парсер для таких строчек сделал.
Вложения
Тип файла: rar RTUCOMPort 2007.rar (32.2 Кб, 14 просмотров)
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
09.10.2023, 14:01
Цитата Сообщение от OdinNastya Посмотреть сообщение
Мне кажется принимает число, тк пробовала передавать строку и оно не понимала команду.
Нужно это выяснить, хотя мне кажется, что принимает число.
Тогда нужно убедиться в правильной последовательности байт.
1A1B и 1B1A - это, как ты понимаешь, разные числа.
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,495
09.10.2023, 14:10
Цитата Сообщение от OdinNastya Посмотреть сообщение
Мне по Com port надо передать hex команду
Цитата Сообщение от OdinNastya Посмотреть сообщение
Мне кажется принимает число, тк пробовала передавать строку и оно не понимала команду.
Не совсем понятно, понятие HEX, DEC, BIN есть в текстовой записи числа, а в компьютере все числа представлены в двоичном виде.
Если устройство принимает команды вида "SIZE=1A", то это текстовые команды. Можно так:
Delphi
1
2
3
4
5
var
  s: string;
  n: integer;
...
  s := Format('COMMAND=%x', [n]);
0
 Аватар для Beltar
1071 / 512 / 41
Регистрация: 05.05.2022
Сообщений: 3,603
09.10.2023, 14:13
Delphi
1
array [0..15] of Char;
Вы в курсе, что Char в Delphi до 2009 однобайтовый, а с 2009 2-хбайтовый UnicodeChar? Как и строки.
0
0 / 0 / 0
Регистрация: 05.10.2023
Сообщений: 116
09.10.2023, 14:16  [ТС]
Beltar, Beltar, WriteFile уже сделала. Теперь надо получить посылку/ прочитать ReadFile.
Но мне не то приходит или вообще все зависает.
Спасибо за арфи,сейчас разбираться буду.
0
 Аватар для Beltar
1071 / 512 / 41
Регистрация: 05.05.2022
Сообщений: 3,603
09.10.2023, 14:21
А чем вас onRxChar компонента не устраивает? Просто открыть порт и слушать, что приходит. Тем более что приходить может кусками.
0
0 / 0 / 0
Регистрация: 05.10.2023
Сообщений: 116
09.10.2023, 14:56  [ТС]
Цитата Сообщение от Beltar Посмотреть сообщение
А чем вас onRxChar компонента не устраивает?
, потому что кто дал задания, сказал, что желательно сделать, через win api

Добавлено через 3 минуты
Constcat, байты данных передаются младшим разрядом (битом) вперёд.

Добавлено через 7 минут
Стороння программа распознаёт команду, которая введена мной в моей программе.
к примеру есть два параметра рост и вес. В зависимости от команды мне или рост, или вес значения должны придти)

Сейчас отправляю команду и она ее распознает, и выводит в стороннем приложении ее значения (рост - ВА (это 186dec)). Сейчас мне надо получить эти BA или 10111010.
0
 Аватар для Beltar
1071 / 512 / 41
Регистрация: 05.05.2022
Сообщений: 3,603
09.10.2023, 15:17
Как называется протокол, может стандартный?

Если вы используете компонент, то это точно не WinAPI напрямую. Да и я от реализации на WinAPI отказался в пользу компонента просто потому, что я про работу с COM-портом не знаю ни хрена, и надежность моей работы неизбежно будет низкая, а создатель компонента на котором половина проектов в мире поди сделана, знал про порты ВСЁ.

Добавлено через 19 минут
Что касается строковых протоколов вообще, то они удобны принимающей стороне, я видел такое на теплосчетчике, когда готовый отчет с него просто через порт посылается, или просто непрерывная отправка текстовых значений параметра. Не надо парсера. Для команд, идущих на устройство, текст не имеет смысла, т. к. строка в терминах конкретного языка программирования это одно, а передается иное, просто поток байт. Передача именно строки может быть вообще не предусмотрена. А если предусмотрена, то это будет что-то очень примитивное, вроде Си-строки, т. е. набора байтов с #0 в конце. И намного проще делать команды числовыми.

Типа: Номер N, дай Integer по адресу XX. Допустим дай Integer имеет код 1. Номер, скажем 10 (хотя как именно устройства понимают, что сейчас пришел именно номер - это отдельная тема, мне известны такие критерии, как тишина на линии и смена четности для адреса, наверняка еще способы есть). Адрес AC BD. И вы пошлете
"0A 01 AC BD" плюс 1-2 байта контрольной суммы.

Прислать же вам значение параметра в виде строки, прибор вполне может. Тем более, если там только числа, а значит вопросы кодировки отсутствуют. Но вместо того, чтобы гадать, лучше выложите документацию.
0
0 / 0 / 0
Регистрация: 05.10.2023
Сообщений: 116
09.10.2023, 15:35  [ТС]
Цитата Сообщение от Beltar Посмотреть сообщение
И намного проще делать команды числовыми.
так я и сделала числовым, а теперь надо прослушать)
Документацию не могу выкладывать.

Изначально ссылалась на эту статью, но у меня программа не работала
http://delartidea.blogspot.com/2015/07/com.html
Пришла сюда на форум и подсказали с WriteFile, a теперь к ReadFile пришла.

Добавлено через 1 минуту
Цитата Сообщение от Beltar Посмотреть сообщение
надежность моей работы неизбежно будет низкая, а создатель компонента на котором половина проектов в мире поди сделана, знал про порты ВСЁ.
никто не спорит, но просят альтернативу.
0
 Аватар для Beltar
1071 / 512 / 41
Регистрация: 05.05.2022
Сообщений: 3,603
09.10.2023, 15:45
Сначала сделайте, чтобы заработало любым удобным способом, а потом можно пытаться достичь того же результата любым др. способом.

Протокол обмена с разными устройствами в свободной продаже секретным не бывает. Мне как-то для весов вообще ничего не дали, но т. к. фирменное ПО все равно есть, то определить простой протокол с помощью сниффера и небольшого предположения о структуре ответа заняло ОЧЕНЬ немного времени.
0
0 / 0 / 0
Регистрация: 05.10.2023
Сообщений: 116
09.10.2023, 16:03  [ТС]
Цитата Сообщение от Beltar Посмотреть сообщение
Сначала сделайте, чтобы заработало любым удобным способом,
Так вроде бы получилось,но просто цифры какие-то приходят странные)))
мне кажется это из-за того, что я буферу тип integer дала и мало ли знающие люди, скажут,что лучше другой тип.
я понимаю,что железо общается bin, так тогда хотя бы bin получить.
Если использую как автор в той статье (Array of Char),то программа зависает.

Мне то приходит,что порт прочитан, но теперь надо это отшлифовать.
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
09.10.2023, 16:13
Цитата Сообщение от OdinNastya Посмотреть сообщение
мне кажется это из-за того, что я буферу тип integer дала и мало ли знающие люди, скажут,что лучше другой тип.
(осторожно) Я когда познакомился с TStream (TMemoryStream), про другие буфера практически забыл))))
Если с ним разобраться, то будет очень удобно.

Для гарантированно небольших буферов иногда использую обычный ShortString (с учетом нулевого элемента длины).
0
0 / 0 / 0
Регистрация: 05.10.2023
Сообщений: 116
09.10.2023, 16:47  [ТС]
Constcat, я когда сделала
Delphi
1
TForm1.ReadPort(var Buf : ShortString ; Size: Word): Integer;
(если правильно поняла)
то оно то прочитало))) но буфер='' )

Поэтому сделала
Delphi
1
function TForm1.ReadPort(var Buf : Byte ; Size: Word): Integer;
и теперь приходят байтами.
И если я несколько раз буду нажимать на кнопку прием , то приходит по порядку значения.

К примеру. В источнике : 0 A8 7 3 AC // вообще из этого параметра/числа я в коде потом буду с бубном плясать,чтобы адекватное для человека значения получила.
ко мне приходят : 0 168 7 3 172 (соответствуют hex)
если я дальше бы нажимала кнопку чтения, то выводились бы нули.

Поэтому мне надо сделать сделать цикл в функции чтения,чтобы оно записывало до тех пор, пока не встретит нуль?
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
09.10.2023, 17:10
Цитата Сообщение от OdinNastya Посмотреть сообщение
Delphi
1
TForm1.ReadPort(var Buf : ShortString ; Size: Word): Integer;
Не-не-не. Не так.
В качестве параметра нужно так и оставлять var Buf - это позволит передавать в процедуру любую переменную в качестве буфера, нужно только Size правильно назначать.
Delphi
1
TForm1.SomeProc(var Buf; Size: Word): Integer;
А вот передавать ShortString в эту процедуру нужно так:
Delphi
1
2
3
4
5
6
7
8
var S: ShortString;
   Size: Word;
   Res: Integer;
begin
S[1]:='.....'; //1 символ, например char(100)
S[2]:='.....'; //.........
Size:=2;
Res:=TForm1.SomeProc(S[1], Size);
0
 Аватар для Beltar
1071 / 512 / 41
Регистрация: 05.05.2022
Сообщений: 3,603
09.10.2023, 18:03
Я помню у меня в начале 2019-го с линии контроллеров на станках вообще шла помеха, которая была даже визуально видна и как моргание светодиода на преобразователе, и как приход обрывочных FF при открытом порте диагностической программы. Так что если вы что-то получили, то это не значит ничего. Вам может прийти искаженное 100 раз и даже просто шум.

Вы понимаете, что именно вам пришло и правильные ли это данные? Может нужно байты переставить, если младший байт идет первым. Вы же должны видеть показания прибора, соотносится ли то что пришло с тем, что вы видите?

Читать в цикле можно либо, когда вам непрерывно данные присылаются, либо вы послали запрос, вам пришел ответ. Или не пришел, т. е. нужен таймаут. Циклическое чтение делается через таймер и может быть довольно сложно организовано. Про прямое управление линиями RX и TX я даже не заикаюсь.

Delphi
1
TForm1.ReadPort(var Buf : ShortString ; Size: Word): Integer;
Вы в курсе, что там по 0 индексу длина строки лежит?

Если не очень понимаете, что делаете, то лучше array of Byte. Можно даже фиксированной длины.
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
09.10.2023, 18:21
Цитата Сообщение от Beltar Посмотреть сообщение
Вы в курсе, что там по 0 индексу длина строки лежит?
Я ниже написал, что передавать нужно S[1] в качестве буфера.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.10.2023, 18:21

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...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
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С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru