Перехват COM порта
От: Аноним  
Дата: 01.10.13 12:35
Оценка:
Задача такая:
Есть девайс подключенный к компу по Com порту. К нему подключена консоль чтоб смотреть логи, давать всякие комманды и тд.
Надо в отдельной программе(желательно С#) перехватывать логи с девайса и реагировать на некоторые сообшения.
Как это можно сделать? Можно ли открыть порт без блокировки чтоб терминал мог потом законектиться?
Можно ли создать другой виртуальный порт для консоли, читать, фильтравать и туда перенаправлять?
Re: Перехват COM порта
От: codenet Россия  
Дата: 01.10.13 23:42
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Задача такая:

А>Есть девайс подключенный к компу по Com порту. К нему подключена консоль чтоб смотреть логи, давать всякие комманды и тд.
А>Надо в отдельной программе(желательно С#) перехватывать логи с девайса и реагировать на некоторые сообшения.
А>Как это можно сделать? Можно ли открыть порт без блокировки чтоб терминал мог потом законектиться?
А>Можно ли создать другой виртуальный порт для консоли, читать, фильтравать и туда перенаправлять?

Мне кажется если COM порт уже открыли,то врядли.
Есть такая утилита "Free Serial Port Monitor" ей сперва указываешь порт,а только потом запускаешь программу которая будет работать с этим ком портом.
Если сделать в обратном порядке, то утилита откажется работать с этим портом. Мне кажется она работает с перехватом функций работы с портом,но это только предположение.

На живую(после кого-то) зацепится и слушать,врядли,хотя если есть вариант, то интересно бы было послушать)
Re[2]: Перехват COM порта
От: Аноним  
Дата: 02.10.13 07:43
Оценка:
Здравствуйте, codenet, Вы писали:

C>Мне кажется если COM порт уже открыли,то врядли.

Порт может быть еше открыт. Порядок запуска програм может быть любой. Можно сначало утилиту, а потом терминал.
Re: Перехват COM порта
От: Terre Россия http://terre.h15.ru
Дата: 02.10.13 12:27
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Задача такая:

А>Есть девайс подключенный к компу по Com порту. К нему подключена консоль чтоб смотреть логи, давать всякие комманды и тд.
А>Надо в отдельной программе(желательно С#) перехватывать логи с девайса и реагировать на некоторые сообшения.
А>Как это можно сделать? Можно ли открыть порт без блокировки чтоб терминал мог потом законектиться?
А>Можно ли создать другой виртуальный порт для консоли, читать, фильтравать и туда перенаправлять?

создай виртуальную пару портов COM50-COM51 (com0com например)
далее пишешь прожку на C#, в которой цепляешься к COM-порту, на котором устройство сидит и транслируешь на COM50 (попутно мониторя и фильтруя)
утилиту цепляешь к COM51.
Ну и обратно от утилитки в COM-порт устройства отправляешь.
Maybe rain,
Maybe snow,
Maybe yes,
Maybe no.
Re[2]: Перехват COM порта
От: Terre Россия http://terre.h15.ru
Дата: 02.10.13 12:29
Оценка:
T>Здравствуйте, Аноним, Вы писали:
Если фильтровать не надо, то можно использовать что то вроде SerialPortMonitor
Maybe rain,
Maybe snow,
Maybe yes,
Maybe no.
Re[2]: Перехват COM порта
От: Аноним  
Дата: 02.10.13 13:54
Оценка:
Здравствуйте, Terre, Вы писали:

T>создай виртуальную пару портов COM50-COM51 (com0com например)

T>на котором устройство сидит и транслируешь на COM50 (попутно мониторя и фильтруя)
Как это сделать?
Re: Перехват COM порта
От: just.slon  
Дата: 03.10.13 06:32
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Задача такая:

А>Есть девайс подключенный к компу по Com порту. К нему подключена консоль чтоб смотреть логи, давать всякие комманды и тд.
А>Надо в отдельной программе(желательно С#) перехватывать логи с девайса и реагировать на некоторые сообшения.
А>Как это можно сделать? Можно ли открыть порт без блокировки чтоб терминал мог потом законектиться?
А>Можно ли создать другой виртуальный порт для консоли, читать, фильтравать и туда перенаправлять?

Врят-ли подойдет такой метод, но я сделал для таких случаев вот такой нехитрый девайс: http://s22.postimg.org/o1un8jofl/photo.jpg. Черный конец втыкается в комп, в него втыкается устройство, а два отростка — это вход и выход перепаяные на выход. В результате можно мониторить весь обмен туда/обратно с устройством. Не раз уже выручало, когда нужно подсмотреть или проверить протокол.
Re: Перехват COM порта
От: Аноним  
Дата: 03.10.13 13:13
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Задача такая:



Пошел по другому пути. Прога открывает сом порт, поднимает сокет и транслирует все туда. Терминал (или другой софт) подключается по телнету на сокет. С сом порта все идет на ок. А вот с терминала приходит только строчками(после нажатия ENTER). Посимвольно не отсылает. Работать в vi невозможно(а это очень важно). Нажатия типа ESC,TAB,UP выводятся кракозябрами(B^[[B^[[B^[[A^[[A^[[A^[[D^[[B^[[B^[[A^[[A) и не отсылаются. Команды выводятся дважды:
# ls
ls
Подскажите как сделать чтоб терминал посылал по символьно и не дублировал? Надо что-то отослать из проги в терминал при инициализации сесии?
Код такой:

public void StartListening()
        {
            IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
            IPEndPoint localEP = new IPEndPoint(ipHostInfo.AddressList[0], 11003);

            Console.WriteLine("Local address and port : {0}", localEP.ToString());
            Socket listener = new Socket(localEP.Address.AddressFamily,
                SocketType.Stream, ProtocolType.Tcp);

            try
            {
                listener.Bind(localEP);
                listener.Listen(1);

                while (true)
                {
                    allDone.Reset();

                    Console.WriteLine("Waiting for a connection...");
                    listener.BeginAccept(
                        new AsyncCallback(acceptCallback),
                        listener);
                    allDone.WaitOne();
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }

            Console.WriteLine("Closing the listener...");
        }
        public void acceptCallback(IAsyncResult ar)
        {
            Socket listener = (Socket)ar.AsyncState;
            Socket handler = listener.EndAccept(ar);
            allDone.Set();

            state = new StateObject();
            state.workSocket = handler;
            port = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
            port.Open();

            BackgroundWorker comToSocket = new BackgroundWorker();
            comToSocket.WorkerReportsProgress = false;
            comToSocket.DoWork += new DoWorkEventHandler(
                                delegate(object o, DoWorkEventArgs args)
                                {
                                    byte[] response = new byte[20];
                                    int read = 0;
                                    while (true)
                                    {
                                        read = port.Read(response, 0, response.Length);
                                        if (read > 0)
                                        {
                                            handler.Send(response, 0, read, SocketFlags.None);
                                        }

                                    }
                                }
                                );

            BackgroundWorker socketToCom = new BackgroundWorker();
            socketToCom.WorkerReportsProgress = false;
            socketToCom.DoWork += new DoWorkEventHandler(
                                delegate(object o, DoWorkEventArgs args)
                                {
                                    byte[] response = new byte[20];
                                    int read = 0;
                                    handler.ReceiveBufferSize = 1;
                                    while (true)
                                    {
                                        read = handler.Receive(response);
                                        handler.ReceiveBufferSize = 1;
                                        if (read > 0)
                                        {
                                            port.Write(response, 0, read);
                                        }

                                    }
                                }
                                );

            socketToCom.RunWorkerAsync();
            comToSocket.RunWorkerAsync();
        }
Re[2]: Перехват COM порта
От: Аноним  
Дата: 04.10.13 09:06
Оценка:
Здравствуйте, Аноним, Вы писали:


А>Подскажите как сделать чтоб терминал посылал по символьно и не дублировал? Надо что-то отослать из проги в терминал при инициализации сесии?


Добавил парсер телнет команд. С putty при конекте идет:
IAC WILL NAWS
IAC WILL TSPEED
IAC WILL TERMINAL-TYPE
IAC WILL 39
IAC DO ECHO
IAC WILL SUPPRESS GO AHED

в ответ шлю (пример из книги): IAC SB TERMINAL-TYPE SENDING vt100 IAC SE
Send(new byte[] { 0xFF, 0xFA, 0x18, 0x00, 0x76, 0x74, 0x31, 0x30, 0x30, 0xff, 0xf0 }, 0, 11, SocketFlags.None)

терминал не реагирует
че не так?

Полазил в настройках putty, поставил Local echo:force off, The function keys and keypad: VT100+ — все заработало, можно в vi файлы редактировать.

Но хотелось бы чтоб они автоматом договаривались, без ручной настройки
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.