Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 21.05.2018, 09:15
MaxSt MaxSt вне форума
Прохожий
 
Регистрация: 12.04.2018
Сообщения: 9
Версия Delphi: Delphi 10
Репутация: 10
По умолчанию Работа с COM портом

Добры день.
Есть задача: необходимо отправлять на COM порт данные и выводить ответ на монитор, к примеру, на Memo.
За COM портом находится коммутатор, при отправке команды на вывод текущего IP адреса, коммутатор предоставляет данные о своем статусе и т.д.
Ответить с цитированием
  #2  
Старый 21.05.2018, 09:19
MaxSt MaxSt вне форума
Прохожий
 
Регистрация: 12.04.2018
Сообщения: 9
Версия Delphi: Delphi 10
Репутация: 10
По умолчанию Пример

DES-1228/ME:4#sh sw
Command: show switch

Device Type : DES-1228/ME Metro Ethernet Switch
MAC Address : АА-АА-АА-АА-АА-АА
IP Address : 192.168.3.88 (Manual)
VLAN Name : 500
Subnet Mask : 255.255.255.0
Default Gateway : 192.168.3.254

DES-1228/ME:4#show vlan
Command: show vlan

VID : 1 VLAN Name : default
VLAN Type : Static Advertisement : Enabled
Member Ports : 25-28
Static Ports : 25-28
Current Tagged Ports :
Current Untagged Ports : 25-28
Static Tagged Ports :
Static Untagged Ports : 25-28
Forbidden Ports :
Ответить с цитированием
  #3  
Старый 21.05.2018, 10:25
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Недостаточно вводных данных, как и чем происходит "общение" со свичем, по вебморде, телнету etc., необходимо разбить задачу на подзадачи и искать их реализацию менее глобально
Ответить с цитированием
  #4  
Старый 21.05.2018, 10:26
MaxSt MaxSt вне форума
Прохожий
 
Регистрация: 12.04.2018
Сообщения: 9
Версия Delphi: Delphi 10
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Недостаточно вводных данных, как и чем происходит "общение" со свичем, по вебморде, телнету etc., необходимо разбить задачу на подзадачи и искать их реализацию менее глобально
Причем тут веб или телнет, через консольник. Локально.
Ответить с цитированием
  #5  
Старый 21.05.2018, 10:39
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от MaxSt
...через консольник. Локально.
Тогда нужен пример "общения" с консолью, из неё данные получить можно в прынципе
Ответить с цитированием
  #6  
Старый 21.05.2018, 10:58
MaxSt MaxSt вне форума
Прохожий
 
Регистрация: 12.04.2018
Сообщения: 9
Версия Delphi: Delphi 10
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Тогда нужен пример "общения" с консолью, из неё данные получить можно в прынципе
Не совсем понял про пример, можно подробнее?
Ответить с цитированием
  #7  
Старый 21.05.2018, 11:10
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Так понимаю, сейчас идёт "обмен данными" с устройством посредством подачи\приёма комманд через консольный интерфейс, выходит задача состоит в эмуляции данного процесса и получении приложением данных из неё (консоли), вот и нужен пример, как это происходит?
Ответить с цитированием
  #8  
Старый 21.05.2018, 11:45
MaxSt MaxSt вне форума
Прохожий
 
Регистрация: 12.04.2018
Сообщения: 9
Версия Delphi: Delphi 10
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Так понимаю, сейчас идёт "обмен данными" с устройством посредством подачи\приёма комманд через консольный интерфейс, выходит задача состоит в эмуляции данного процесса и получении приложением данных из неё (консоли), вот и нужен пример, как это происходит?
При вводе любого сообщения коммутатор анализирует содержимое строки и выдает ответ. В случае, если это распознаваемая им команда, то он ее выполняет.
Если же просто символы, то он выдает стандартный ответ.

Например:
Отправляем ему команду создать vlan 111 и дать ему соответственно имя 111.
DES-1228/ME:5#create vlan 111 tag 111
В ответ на что получаем повтор выполняемой команды и результат.
Command: create vlan 111 tag 111

Success.

При вводе нераспозноваемой команды он выдает возможный перечень команд.
DES-1228/ME:5#a

Available commands:
.. ? cable_diag clear
config create delete dir
disable download enable login
logout ping ping6 reboot
reset save show smtp
telnet traceroute upload

Коммутатор постоянно находится в процессе ожидания ввода команды.

Последний раз редактировалось MaxSt, 21.05.2018 в 11:51.
Ответить с цитированием
  #9  
Старый 21.05.2018, 12:07
MaxSt MaxSt вне форума
Прохожий
 
Регистрация: 12.04.2018
Сообщения: 9
Версия Delphi: Delphi 10
Репутация: 10
По умолчанию

Фактически задачу можно разбить на 4 подпункта.
1. Подключение к конкретному порту COMn, где n вводимый пользователем порт.
2. Отправка текстового сообщения на порт.
3. Получение ответа.
4. Вывод ответа на экран.
И дальше снова 2-3-4,2-3-4, до тех пор, пока работа с оборудование не будет завершена.
Ответить с цитированием
  #10  
Старый 21.05.2018, 12:24
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Тогда вам видимо вот это пригодится
Код:
interface
uses Windows;

type
TComPort = class
private
   hFile: THandle;
public
   constructor Create;
   destructor Destroy; override;
   function InitCom(BaudRate, PortNo: Integer; Parity: Char;
     CommTimeOuts: TCommTimeouts): Boolean;
   procedure CloseCom;
   function ReceiveCom(var Buffer; Size: DWORD): Integer;
   function SendCom(var Buffer; Size: DWORD): Integer;
   function ClearInputCom: Boolean;
end;

implementation

uses SysUtils;

constructor TComPort.Create;
begin
inherited;
CloseCom;
end;

destructor TComPort.Destroy;
begin
CloseCom;
inherited;
end;

function TComPort.InitCom(BaudRate, PortNo: Integer; Parity: Char;
CommTimeOuts: TCommTimeouts): Boolean;
var
FileName: string;
DCB: TDCB;
PortParam: string;
begin
result := FALSE;
FileName := 'Com' + IntToStr(PortNo); {имя файла}
hFile := CreateFile(PChar(FileName),
   GENERIC_READ or GENERIC_WRITE, 0, nil,
   OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if hFile = INVALID_HANDLE_VALUE then
   exit;
//установка требуемых параметров
GetCommState(hFile, DCB); //чтение текущих параметров порта
PortParam := 'baud=' + IntToStr(BaudRate) + ' parity=' + Parity +
   ' data=8 stop=1 ' +
   'octs=off';
if BuildCommDCB(PChar(PortParam), DCB) then
begin
   result := SetCommState(hFile, DCB) and
     SetCommTimeouts(hFile, CommTimeOuts);
end;

if not result then
   CloseCom;
end;

procedure TComPort.CloseCom;
begin
if hFile < > INVALID_HANDLE_VALUE then
   CloseHandle(hFile);
hFile := INVALID_HANDLE_VALUE;
end;

function TComPort.ReceiveCom(var Buffer; Size: DWORD): Integer;
var
Received: DWORD;
begin
if hFile = INVALID_HANDLE_VALUE then
   raise Exception.Create('Не открыта запись в Com порт');
if ReadFile(hFile, Buffer, Size, Received, nil) then
begin
   Result := Received;
end
else
   raise Exception.Create('Ошибка приема данных: ' + IntToStr(GetLastError));
end;

function TComPort.SendCom(var Buffer; Size: DWORD): Integer;
var
Sended: DWORD;
begin
if hFile = INVALID_HANDLE_VALUE then
   raise Exception.Create('Не открыта запись в Com порт');
if WriteFile(hFile, Buffer, Size, Sended, nil) then
begin
   Result := Sended;
end
else
   raise Exception.Create('Ошибка передачи данных: ' + IntToStr(GetLastError));
end;

function TComPort.ClearInputCom: Boolean;
begin
if hFile = INVALID_HANDLE_VALUE then
   raise Exception.Create('Не открыта запись в Com порт');
Result := PurgeComm(hFile, PURGE_RXCLEAR);
end;
end.
только порт текст не передает и не принимает, немного другими понятиями он оперирует, проще сделать эмуляцию, но это совсем другая песня
Ответить с цитированием
  #11  
Старый 21.05.2018, 12:43
MaxSt MaxSt вне форума
Прохожий
 
Регистрация: 12.04.2018
Сообщения: 9
Версия Delphi: Delphi 10
Репутация: 10
По умолчанию

Почему он не хочет подключаться к COM6, который RS232 подключенный через USB (USB Serial Port)?
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  DCB   : TDCB;
  hPort : THandle;
begin
  hPort := CreateFile(PChar('COM'+Form1.Edit1.Text),GENERIC_READ + GENERIC_WRITE,0, nil,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  if (hPort = INVALID_HANDLE_VALUE)
  then
    begin
    ShowMessage('Error!');
    exit;
    end;
end;
Админ: Пользуемся тегами при оформлении кода!

Выдает Error, но смело подключается к COM1 (последовательный порт).

Последний раз редактировалось Admin, 21.05.2018 в 19:16.
Ответить с цитированием
  #12  
Старый 21.05.2018, 14:44
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 660
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Чтобы не заморачиваться, возьмите готовый, бесплатный и стабильно работающий компонент BComPort. А для указания порта используйте \\.\COM.
Если не получится что-то - укажите подробно на ошибку.
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием
  #13  
Старый 21.05.2018, 23:29
MaxSt MaxSt вне форума
Прохожий
 
Регистрация: 12.04.2018
Сообщения: 9
Версия Delphi: Delphi 10
Репутация: 10
По умолчанию

Цитата:
Сообщение от dr. F.I.N.
Чтобы не заморачиваться, возьмите готовый, бесплатный и стабильно работающий компонент BComPort. А для указания порта используйте \\.\COM.
Если не получится что-то - укажите подробно на ошибку.
Спасибо за подсказку, в поисках BComPort "нарвался" на TComPort, вполне себе удобный компонент.
Но вопросов становится все больше.
Для подключения к порту успешно используется:
Form1.ComPort1.Port:=('COM5');
Form1.ComPort1.Open;
Для записи в порт:
Form1.ComPort1.WriteStr('text'+#13#10);
Для считывания:
Form1.ComPort1.Read(s,16); где s - переменная типа string.
Возник вопрос.

Последний раз редактировалось MaxSt, 21.05.2018 в 23:44.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:27.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter