Задача такая:
Есть девайс подключенный к компу по Com порту. К нему подключена консоль чтоб смотреть логи, давать всякие комманды и тд.
Надо в отдельной программе(желательно С#) перехватывать логи с девайса и реагировать на некоторые сообшения.
Как это можно сделать? Можно ли открыть порт без блокировки чтоб терминал мог потом законектиться?
Можно ли создать другой виртуальный порт для консоли, читать, фильтравать и туда перенаправлять?
Здравствуйте, Аноним, Вы писали:
А>Задача такая: А>Есть девайс подключенный к компу по Com порту. К нему подключена консоль чтоб смотреть логи, давать всякие комманды и тд. А>Надо в отдельной программе(желательно С#) перехватывать логи с девайса и реагировать на некоторые сообшения. А>Как это можно сделать? Можно ли открыть порт без блокировки чтоб терминал мог потом законектиться? А>Можно ли создать другой виртуальный порт для консоли, читать, фильтравать и туда перенаправлять?
Мне кажется если COM порт уже открыли,то врядли.
Есть такая утилита "Free Serial Port Monitor" ей сперва указываешь порт,а только потом запускаешь программу которая будет работать с этим ком портом.
Если сделать в обратном порядке, то утилита откажется работать с этим портом. Мне кажется она работает с перехватом функций работы с портом,но это только предположение.
На живую(после кого-то) зацепится и слушать,врядли,хотя если есть вариант, то интересно бы было послушать)
Re[2]: Перехват COM порта
От:
Аноним
Дата:
02.10.13 07:43
Оценка:
Здравствуйте, codenet, Вы писали:
C>Мне кажется если COM порт уже открыли,то врядли.
Порт может быть еше открыт. Порядок запуска програм может быть любой. Можно сначало утилиту, а потом терминал.
Здравствуйте, Аноним, Вы писали:
А>Задача такая: А>Есть девайс подключенный к компу по Com порту. К нему подключена консоль чтоб смотреть логи, давать всякие комманды и тд. А>Надо в отдельной программе(желательно С#) перехватывать логи с девайса и реагировать на некоторые сообшения. А>Как это можно сделать? Можно ли открыть порт без блокировки чтоб терминал мог потом законектиться? А>Можно ли создать другой виртуальный порт для консоли, читать, фильтравать и туда перенаправлять?
создай виртуальную пару портов COM50-COM51 (com0com например)
далее пишешь прожку на C#, в которой цепляешься к COM-порту, на котором устройство сидит и транслируешь на COM50 (попутно мониторя и фильтруя)
утилиту цепляешь к COM51.
Ну и обратно от утилитки в COM-порт устройства отправляешь.
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 (попутно мониторя и фильтруя)
Как это сделать?
Здравствуйте, Аноним, Вы писали:
А>Задача такая: А>Есть девайс подключенный к компу по 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