|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Работа с COM портом
Добры день.
Есть задача: необходимо отправлять на COM порт данные и выводить ответ на монитор, к примеру, на Memo. За COM портом находится коммутатор, при отправке команды на вывод текущего IP адреса, коммутатор предоставляет данные о своем статусе и т.д. |
#2
|
|||
|
|||
Пример
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
|
||||
|
||||
Недостаточно вводных данных, как и чем происходит "общение" со свичем, по вебморде, телнету etc., необходимо разбить задачу на подзадачи и искать их реализацию менее глобально
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#4
|
|||
|
|||
Цитата:
|
#5
|
||||
|
||||
Цитата:
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#6
|
|||
|
|||
Цитата:
|
#7
|
||||
|
||||
Так понимаю, сейчас идёт "обмен данными" с устройством посредством подачи\приёма комманд через консольный интерфейс, выходит задача состоит в эмуляции данного процесса и получении приложением данных из неё (консоли), вот и нужен пример, как это происходит?
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#8
|
|||
|
|||
Цитата:
Если же просто символы, то он выдает стандартный ответ. Например: Отправляем ему команду создать 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
|
|||
|
|||
Фактически задачу можно разбить на 4 подпункта.
1. Подключение к конкретному порту COMn, где n вводимый пользователем порт. 2. Отправка текстового сообщения на порт. 3. Получение ответа. 4. Вывод ответа на экран. И дальше снова 2-3-4,2-3-4, до тех пор, пока работа с оборудование не будет завершена. |
#10
|
||||
|
||||
Тогда вам видимо вот это пригодится
Код:
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
|
|||
|
|||
Почему он не хочет подключаться к 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
|
||||
|
||||
Чтобы не заморачиваться, возьмите готовый, бесплатный и стабильно работающий компонент BComPort. А для указания порта используйте \\.\COM№.
Если не получится что-то - укажите подробно на ошибку. Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. |
#13
|
|||
|
|||
Цитата:
Но вопросов становится все больше. Для подключения к порту успешно используется: 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. |