Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.05.2010, 11:06   #1
100GRamm
ХРЕНЕЮ с ИНДИ
Пользователь
 
Аватар для 100GRamm
 
Регистрация: 08.02.2009
Сообщений: 92
По умолчанию Работа с RS232 в DELPHI

Всем привет! Если у кого информация по работе с 232 интерфейсом? Как (своей программой) считать или послать данные? Может кто разбирался с железом ?
Велкам! :D http://radiomedtech.ucoz.ru
100GRamm вне форума Ответить с цитированием
Старый 02.05.2010, 12:12   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

в любом help-е (delphi-world, DRKB, dFAQ от Михалыча) есть примеры работы с COM портом
Код:
function SetCommTiming: Boolean;
var Timeouts: TCommTimeOuts;
begin
 with TimeOuts do begin
  ReadIntervalTimeout := 1;
  ReadTotalTimeoutMultiplier := 0;
  ReadTotalTimeoutConstant := 1;
  WriteTotalTimeoutMultiplier := 2;
  WriteTotalTimeoutConstant := 2;
 end;
 Result:= SetCommTimeouts(Com,Timeouts)
end;

function SetCommBuffer(InQueue, OutQueue: LongInt): Boolean;
begin
 Result:= SetupComm(Com, InQueue, OutQueue)
end;

function SetCommStatus(Baud: Integer): Boolean;
var DCB: TDCB;
begin
 with DCB do begin
  DCBlength:=SizeOf(Tdcb);
  BaudRate := Baud;
  Flags:=12305;
  wReserved:=0;
  XonLim:=600;
  XoffLim:=150;
  ByteSize:=8;
  Parity:=0;
  StopBits:=0;
  XonChar:=#17;
  XoffChar:=#19;
  ErrorChar:=#0;
  EofChar:=#0;
  EvtChar:=#0;
  wReserved1:=65;
 end;
 Result:= SetCommState(Com, DCB)
end;

function opencom(comPort:string; InQueue,OutQueue,Baud: LongInt): Boolean;
begin
 comport:= uppercase(comport);
 if Com > 0 then closecom;
 Com:= CreateFile(PChar(comPort),
  GENERIC_READ or GENERIC_WRITE,
  0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
 Result:= (Com > 0) and SetCommTiming and
 SetCommBuffer(InQueue,OutQueue) and
 SetCommStatus(Baud)
end;

procedure sendcom(s: string);
var TempArray: array[1..255] of Byte;
    Count    : Integer;
    TX_Count : cardinal;
begin
 for Count:= 1 to Length(S) do TempArray[Count]:= Ord(S[Count]);
 WriteFile(Com, TempArray,Length(S),TX_Count,nil)
end;

function readcom: string;
var RX_Count : cardinal;
    TempArray: array[1..255] of Byte;
    Count    : Integer;
begin
 result:= '';
 ReadFile(Com, TempArray, 255, RX_Count, nil);
 for Count:= 1 to RX_Count do result:= result + Chr(TempArray[Count])
end;

procedure closecom;
begin
 CloseHandle(Com) //Com:= -1
end;
...также можно воспользоваться готовыми надстройками над API - компонентами CPort, comm32, BCPort...
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 13.04.2021, 14:18   #3
VGuller
Пользователь
 
Регистрация: 08.04.2021
Сообщений: 10
По умолчанию

подскажите как прописать совпадение в label код который приходит из ком порта 0f 0f 0f 05 00 00 eb 0a 00 00 00 eb отправлять в ком не надо а только читать и пересылать в label голову сломал как написать код, помогите может у кого есть заготовка?

[11/04/2021 16:26:43]
181 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM4)
STATUS_SUCCESS
IOCTL_SERIAL_GET_COMMSTATUS - Request returns information about the communication status of a COM port
Errors - 0
HoldReasons - 0
AmountInInQueue - 12
AmountInOutQueue - 0
EofReceived - 0
WaitForImmediate - 0
----------------------------------------------------------------------------------
[11/04/2021 16:26:43]
183 IRP_MJ_READ - Transfers data from a COM port to a client (COM4) - 12 bytes of 12
STATUS_SUCCESS
0f 0f 0f 05 00 00 eb 0a 00 00 00 eb ......л....л
----------------------------------------------------------------------------------
[11/04/2021 16:26:43]
185 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM4)
STATUS_SUCCESS
IOCTL_SERIAL_WAIT_ON_MASK - Request is used to wait for the occurrence of any wait event specified by using an IOCTL_SERIAL_SET_WAIT_MASK request
Mask - 0x00000001 (EV_RXCHAR)
----------------------------------------------------------------------------------
[11/04/2021 16:26:43]
187 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM4)
STATUS_SUCCESS
IOCTL_SERIAL_GET_WAIT_MASK - Request returns the event wait mask that is currently set on a COM port
Mask - 0x00000119 (EV_CTS | EV_DSR | EV_RING | EV_RXCHAR)
----------------------------------------------------------------------------------
вот такая команда приходит

Последний раз редактировалось VGuller; 13.04.2021 в 14:43.
VGuller вне форума Ответить с цитированием
Старый 17.04.2021, 12:35   #4
stalkernet
Пользователь
 
Регистрация: 28.02.2009
Сообщений: 42
По умолчанию

VGuller использовал для промышленного применения.
работает стабильно до сих пор - правда уже через переходник USB-COM. на чипе от FTDI. Платы расширения на PCI тоже видел. правда требоваалась настройка.

вобщем сам unit и пример терминала. вариант для отладки был. поэтому извеняй.

пользование терминалом.

запускаешь две копии программы. одну настраиваешь на com3 другую на com4. порты соединил нуль теринальным кабелем. ну или на разных машинах с ком портом.

уже все не помню. давно было.

нашел драйвер виртуальных портов что пользовал для отладки....

надеюсь поможет.
Вложения
Тип файла: 7z BCPort.7z (6.1 Кб, 19 просмотров)
Тип файла: 7z virtual terminal.7z (437.0 Кб, 17 просмотров)
Тип файла: 7z Eltima.Software.Virtual.Serial.Port.Driver.v6.0.1.115.Cracked-iNViSiBLE.7z (2.95 Мб, 20 просмотров)
stalkernet вне форума Ответить с цитированием
Старый 17.04.2021, 15:28   #5
VGuller
Пользователь
 
Регистрация: 08.04.2021
Сообщений: 10
По умолчанию

stalkernet, благодарю вас за помощь , я хочу до конца понять процедуру отслеживания и реагирование объектом в форме на поступление команды в ком порт, сейчас попытаюсь объяснить свои задачи, вот среди этих команд и информации поступающих в порт мне нужно отследить и передать в объект находящийся в форме и который будет менять цвет при поступлении команды прописанной в нем и при совпадении этих данных будет происходить это действие , это как если писать для микроконтроллера вольтметр, градация ацп выдает двоичный код который можно прописать в любом из портов который в последствии будет включаться, вроде правильно сформулировал )))))
VGuller вне форума Ответить с цитированием
Старый 17.04.2021, 18:57   #6
stalkernet
Пользователь
 
Регистрация: 28.02.2009
Сообщений: 42
По умолчанию

VGuller с точки зрения как делается в промишленности. но предупреждаю сразу. забросил ле 7 назад уже, после 20 лет разработок....

шаг первый и самый главный.

Жестко Определиться с форатом пакета\кадра. например:
1 байт - признак данных. (1 - данные АЦП)
2,3 байт - данные ацп - где старший\младший решай сам.
4 байт - контрольная сумма.

итого 4 байта.

теперь надо опредилится как будеш передовать из UART. посимвольно или бинарно. в зависимости от языка для контроллера.

в программе на коммпе.
тут несколько вариантов.
или через отдельный поток или таймер.
нужно постоянно мониторить буфер СОМ порта.
таймер.
на форму кидаешь таймер.
в обработчике читаешь буфер.
обнуляешь его.
у тебя на руках массив из 4 байт. дальше с ним делаешь что тебе надо.

все это умеет BCPort. Ну и почитай ModBus.

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

Последний раз редактировалось stalkernet; 17.04.2021 в 18:59.
stalkernet вне форума Ответить с цитированием
Старый 17.04.2021, 19:55   #7
VGuller
Пользователь
 
Регистрация: 08.04.2021
Сообщений: 10
По умолчанию

stalkernet, в порт летит всякий мусор но среди мусора есть строчка 0f 0f 0f 05 00 00 eb 0a 00 00 00 eb вот ее надо прочитать и такую же строчку прописать в блоке если строка прилетит из порта и совпадет с строкой в блоке то блок должен поменять цвет
VGuller вне форума Ответить с цитированием
Старый 17.04.2021, 20:21   #8
stalkernet
Пользователь
 
Регистрация: 28.02.2009
Сообщений: 42
По умолчанию

VGuller Правильно понял?

ты своей прогой опрашиваешь порт с определенным интервалом. если буфер не равен нулю. его читаешь. буфер представляетиз себя кашу. если эта каша представляет собой вид - каша неизвестной длинны + 0f 0f 0f 05 00 00 eb 0a 00 00 00 eb + каша. то надо чтото кудато записать.
записать надо 0f 0f 0f 05 00 00 eb 0a 00 00 00 eb ......л....л ? или просто 0f 0f 0f 05 00 00 eb 0a 00 00 00 eb ? или ......л....л?

или 0f 0f 0f 05 00 00 eb 0a 00 00 00 eb - это признак необходимых данных?

повторю буфер это массив типа байт. как искать последовательность в массиве думаю обьяснять не нужно. просто с шагом от 0 до длинны перебираешь массив - если все совпало - вот твоя строка. дальше решай сам что с ней делать.

или может надо - если она появилась надо сделать отметку. а если она повторно появилась зажечь индикатор?

Да и что такое блок и что в него надо записать?

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

Последний раз редактировалось stalkernet; 17.04.2021 в 20:42.
stalkernet вне форума Ответить с цитированием
Старый 18.04.2021, 02:37   #9
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

VGuller, вы сами собираетесь писать программу или нет? Если нет, то может вам лучше обратиться во фриланс и заказать там?
Пока что в ваших постах не было никаких намёков что вы пытались что-то делать сами. Ну кроме освоения (частичного) PortMon'а от брата нашего старшего Марка Руссиновича.
northener вне форума Ответить с цитированием
Старый 17.09.2021, 00:18   #10
Foxpronet
Пользователь
 
Регистрация: 11.08.2011
Сообщений: 67
По умолчанию

Подскажите пожалуйста, все-ли грамотно в коде (создал вопрос по аналогичной тематике):

https://programmersforum.ru/showthread.php?t=340315

Последний раз редактировалось Foxpronet; 17.09.2021 в 00:20. Причина: Чел. фактор
Foxpronet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi. Работа с БД. Xeon332 Фриланс 12 22.03.2010 22:22
Работа с графикой в Delphi AlterProger Помощь студентам 3 20.01.2010 15:59
Ibm Anyplace Kiosk и его сканер штрих-кода Rs232 California Компьютерное железо 2 06.07.2008 18:41
Работа со строками. Delphi defeat Помощь студентам 4 10.01.2008 13:39