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

Работа с ComPort

05.10.2023, 16:03. Показов 6606. Ответов 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
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
06.10.2023, 15:07
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от OdinNastya Посмотреть сообщение
тут у меня ругается и требует переменную
Блин, ошибся...
Pascal
1
WriteFile(Comfile, Buf, Size, i, nil)
По-идее, так.
Если p = @Buf, то p^ = Buf
WriteFile - это что? Какого типа там параметры?
0
0 / 0 / 0
Регистрация: 05.10.2023
Сообщений: 116
06.10.2023, 15:25  [ТС]
Цитата Сообщение от Constcat Посмотреть сообщение
По-идее, так.
Если p = @Buf, то p^ = Buf
Да)

Delphi
1
2
3
4
5
6
7
8
9
10
function TForm1.WritePort(var Buf: char; Size: Word): Integer;
var
  i: Cardinal;
begin
  Result:= 0;
  if not WriteFile(Comfile,Buf, Size, i, nil) then
   exit;
  Inc(Result, i);
  Application.ProcessMessages;
 end;
Все равно идет на end после
Delphi
1
if not WriteFile(Comfile,Buf, Size, i, nil) then
Оно же автоматически воспринимается boolean?
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
06.10.2023, 15:37
Цитата Сообщение от OdinNastya Посмотреть сообщение
Оно же автоматически воспринимается boolean?
Еще раз спрашиваю - есть описание функции WriteFile? Хоть на C++.
По логике, она возвращает false, если не удалось записать.
0
0 / 0 / 0
Регистрация: 05.10.2023
Сообщений: 116
06.10.2023, 15:39  [ТС]
Цитата Сообщение от Constcat Посмотреть сообщение
Еще раз спрашиваю - есть описание функции WriteFile?
нет.
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
06.10.2023, 16:28
Цитата Сообщение от OdinNastya Посмотреть сообщение
нет
Я так полагаю, это оно:
https://learn.microsoft.com/en... -writefile

Как я и предполагал, функция принимает хэндл на файл (в вашем случае это com-порт), нетипизированный буфер и размер данных. Возвращает true, если все в порядке, и false - если ошибка.
В следующем параметре (у вас это i), функция возвращает количество реально записанных байт.
Последний параметр должен быть nil, если файл не открыт в режиме OVERLAPPED. Что это такое - лень разбираться)))

Так же можно получить более подробную информацию об ошибке через функцию GetLastError.
0
0 / 0 / 0
Регистрация: 05.10.2023
Сообщений: 116
06.10.2023, 16:37  [ТС]
Constcat, Блин) Я тогда подумала описание(реализация) функции в коде и была удивлена,что это не внутренняя функция) А Вы имели в этом смысле)
а это читала.

GetLastError супер) Сказал,что параметр задан не верно)
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
06.10.2023, 16:47
Цитата Сообщение от OdinNastya Посмотреть сообщение
Сказал,что параметр задан не верно)
C++
1
2
3
4
5
6
7
BOOL WriteFile(
  [in]                HANDLE       hFile,
  [in]                LPCVOID      lpBuffer,
  [in]                DWORD        nNumberOfBytesToWrite,
  [out, optional]     LPDWORD      lpNumberOfBytesWritten,
  [in, out, optional] LPOVERLAPPED lpOverlapped
);
LPDWORD lpNumberOfBytesWritten - это указатель на двойное слово ("A pointer to the variable that receives the number of bytes written"), т.е., по-идее, нужно не i передавать, а @i
0
0 / 0 / 0
Регистрация: 05.10.2023
Сообщений: 116
06.10.2023, 22:41  [ТС]
Constcat, спасибо за помощь. Попытаюсь еще раз проверить. Скорее всего на данном этапе эту тематику не осилю (
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
06.10.2023, 22:44
Цитата Сообщение от OdinNastya Посмотреть сообщение
Попытаюсь еще раз проверить. Скорее всего на данном этапе эту тематику не осилю
В качестве эксперимента можно посмотреть на поведение WriteFile при выводе в обычный файл, не в com-порт.
Если функция отработает, и в файл выведется то, что нужно, значит дальше нужно будет уже com-порт копать.
0
0 / 0 / 0
Регистрация: 05.10.2023
Сообщений: 116
06.10.2023, 22:54  [ТС]
Constcat, ))
Спасибо,руки зачесались))
Завтра оповещу, как прошло.
0
пофигист широкого профиля
4770 / 3206 / 862
Регистрация: 15.07.2013
Сообщений: 18,613
07.10.2023, 02:54
Блин. Опять шляпки и собачки!
А посмотреть в исходники Дельфи влом?
Delphi
1
2
function WriteFile(hFile: Integer; const Buffer; nNumberOfBytesToWrite: Cardinal;
  var lpNumberOfBytesWritten: Cardinal; lpOverlapped: Pointer): Integer;
Добавлено через 14 минут
Ну где тут нужны шляпки и собачки?

Добавлено через 9 минут
Ну да. Единственная непонятка для новичка, это второй параметр.
Но и тут всё просто. Надо только довериться компилятору, который достаточно умный.
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
07.10.2023, 11:51
Цитата Сообщение от northener Посмотреть сообщение
Pascal
1
var lpNumberOfBytesWritten: Cardinal
Получается, это я автора дезинформировал)))
lpNumberOfBytesWritten в варианте Delphi не указатель.
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,495
07.10.2023, 13:21
Да, если var стоит, то не нужно никаких собачек, просто нужно передать обычную переменную.
0
пофигист широкого профиля
4770 / 3206 / 862
Регистрация: 15.07.2013
Сообщений: 18,613
08.10.2023, 02:47
Цитата Сообщение от Constcat Посмотреть сообщение
lpNumberOfBytesWritten в варианте Delphi не указатель.
В таком варианте в дельфи нет понятия "указатель". Зато есть понятие передачи параметра по "ссылке" или по "значению".
Что если вдуматься одно и то же, только другими словами.
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
08.10.2023, 12:51
Цитата Сообщение от northener Посмотреть сообщение
Зато есть понятие передачи параметра по "ссылке" или по "значению".
Что если вдуматься одно и то же, только другими словами.
Я сравнивал с исходником на C++ из документации Microsoft. Соственно, WriteFile из Delphi - это оболочка для вызова API-шного WriteFile.
Я понимаю, что Delphi пошло по пути максимального обкладывания программистов нежной ваткой, чтобы программисты не дай бог не перенапряглись, или (вдург!) им не пришлось самим контролировать выделение памяти (см. дискуссию о TObject.Create))))))), но в программировании есть и передача по значению, и передача по ссылке, и передача указателя на данные.
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,684
Записей в блоге: 21
08.10.2023, 13:31
а что такого? считаю, что Делфи тут очень удобна
если нужен указатель, то берем var, потому что все сделано за нас. и это закрывает 90% потребностей
если указатель на указатель - берем PSomeType
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
08.10.2023, 15:30
Цитата Сообщение от krapotkin Посмотреть сообщение
а что такого? считаю, что Делфи тут очень удобна
Конечно удобна, кто же спорит. В свете последних веяний "программистом" скоро будет называться тот, кто правильные запросы будет формировать для ChatGPT.
А я буду ворчать, потому что считаю, что несмотря на удобства, программист должен понимать, что у него творится "под капотом". ))))
2
0 / 0 / 0
Регистрация: 05.10.2023
Сообщений: 116
09.10.2023, 12:30  [ТС]
Ребята, получилось!)
Загвоздка была скорее всего в HANDLE hFile, // дескриптор файла
Цитата Сообщение от Constcat Посмотреть сообщение
В качестве эксперимента можно посмотреть на поведение WriteFile при выводе в обычный файл, не в com-порт.
,так что спасибо))
После проверки,что обычный файл записался проверила дополнительно.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if not WriteFile(Comfile,Buf, Size, i, nil) then
begin
     // Обработка ошибок. Если WriteFile вернула False, но при этом GetLastError = ERROR_IO_PENDING
         // Значит, это была не ошибка, и надо дождаться окончания записи
         LastError := GetLastError;
         if LastError = ERROR_IO_PENDING then
            while WaitForSingleObject(Overlap.hEvent, 1000) = WAIT_TIMEOUT do
               Application.ProcessMessages
         else
            // А вот если не ERROR_IO_PENDING - то была ошибка, рассказываем пользователю об этом
            Form1.Memo1.Lines.Add(Format('WriteFile. Ошибка: Error = %s',
               [SysErrorMessage(GetLastError)]))
 
  end;
После этого, мне выводилось : неверный дескриптор.
Delphi
1
2
3
4
5
//до этого
 
ComFile:=CreateFile(Pchar('COM2'), Generic_Read or Generic_Write, 0, nil, open_existing, file_flag_overlapped,0);
//сейчас
ComFile:=CreateFile(Pchar('COM2'), GENERIC_READ or GENERIC_WRITE,  FILE_SHARE_READ, nil, CREATE_ALWAYS, 0, 0);
Добавлено через 1 минуту
AzAtom, Скажите, пожалуйста, может Вы сможете помочь(вижу,что Вы онлайн).
Мне по Com port надо передать hex команду. В зависимости от команды будет возвращаться значение параметра.

Сейчас наладила WriteFile и я вижу, что передается моя команда и так же выводится значения параметра( он в hex) в стороннем приложении.(Пример. отправила 40(dec)тип integer- в стороннем приложение показало 28(hex= 40dec) и его значения 1A 1A B)

Delphi
1
function TForm1.WritePort(var Buf :  integer; Size: Word): Integer;
заранее перевела команды hex в dec и поэтому использую integer.

Теперь у меня вопрос.Мне надо прочитать(ReadFile))

если использовать integer, то оно само как-то перевело, а мне надо самой перевести ,тк для каждого параметра разный алгоритм вычисления(побитно).

Поэтому, мне надо получить BIN или Hex код.
КаК мне это сделать?

Мое integer значения отправить в перевод? Так по калькулятору смотрю и это не то.

Я не знаю,почему не добавляется как новое собщение
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
09.10.2023, 12:39
Цитата Сообщение от OdinNastya Посмотреть сообщение
Поэтому, мне надо получить BIN или Hex код.
КаК мне это сделать?
Скажи, а оборудование на той стороне принимает команду в виде числа, или команду в виде строки?
Я имею ввиду - 1A или "1A"?
0
0 / 0 / 0
Регистрация: 05.10.2023
Сообщений: 116
09.10.2023, 12:48  [ТС]
Цитата Сообщение от Constcat Посмотреть сообщение
принимает команду в виде числа, или команду в виде строки?
Мне кажется принимает число, тк пробовала передавать строку и оно не понимала команду.

Добавлено через 3 минуты
Цитата Сообщение от Constcat Посмотреть сообщение
Я имею ввиду - 1A или "1A"?
но к примеру, я перевела изначально 1А в dec и передала 26 и в сторонней программе отразилось в столбце команд 1А
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.10.2023, 12:48

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера 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