У меня есть последовательное устройство, которое предназначено для приема и ответа на команды от терминала типа VT100. Я могу использовать любое количество «эмуляторов терминала» для работы с этим устройством. Но то, что я ХОЧУ сделать, это отправить серию команд из приложения .NET Windows и получить ответы обратно в том же приложении, чтобы я мог управлять графическим интерфейсом, который будет «простым от грязи» для операторов. Чего я не хочу, так это еще одного эмулятора терминала. Похоже, что с помощью «System.IO.Serial.SerialPort» я могу открыть соединение, отправить сообщение, назначить делегата для получения сообщения, фактически получить сообщение... но сообщение, которое я отправляю (команда), не является интерпретируется так, как я ожидаю (когда я проверяю состояние устройства с помощью эмулятора терминала, состояние не соответствует команде, отправленной через .Net), и сообщение, которое я получаю в ответ, не в формате, который я могу расшифровать.
Я считаю, что мне нужно правильно закодировать команду и правильно декодировать ответ... но я не могу найти документацию, которая четко объясняет, как это сделать.
(Я работаю на С#, но буду признателен за любой пример .Net)
Код, с которым я работаю для создания прототипа:
using System;
using System.IO.Ports;
using System.Text;
namespace busmanager
{
public class buslink
{
SerialPort _serialPort;
Boolean _echo;
Delegate _receiver;
//Defaut Ctor:
public buslink(Delegate Receiver)
{
String[] SerialPorts = System.IO.Ports.SerialPort.GetPortNames();
if (SerialPort.GetPortNames().Length > 0)
{
SetChannel(PortDefinitions.GetDefaults(SerialPort.GetPortNames()[0]), Receiver);
}
else
{
throw new Exception("Unable to connect to serial port");
}
}
//Custom Ctor: for externally defined PortDefinitions
public buslink(PortDefinitions PortDefinitions, Delegate Receiver)
{
SetChannel(PortDefinitions, Receiver);
}
private void SetChannel(PortDefinitions PortDefinitions, Delegate Receiver)
{
_serialPort = new SerialPort()
{
PortName = PortDefinitions.PortName,
//BaudRate = PortDefinitions.BaudRate,
Parity = PortDefinitions.Parity,
StopBits = PortDefinitions.StopBits,
DataBits = PortDefinitions.DataBits,
Handshake = PortDefinitions.Handshake,
ReadTimeout = PortDefinitions.ReadTimeout,
WriteTimeout = PortDefinitions.WriteTimeout,
NewLine = "\n",
Encoding = System.Text.Encoding.ASCII,
DtrEnable = true,
};
_echo = PortDefinitions.Echo;
_serialPort.DataReceived += new SerialDataReceivedEventHandler(_serialPort_DataReceived);
_serialPort.Open();
_receiver = Receiver;
}
void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte[] c = new byte[1000];
int x = _serialPort.Read(c,0,1000);
string d = c.ToString();
_receiver.DynamicInvoke(_serialPort.ReadExisting());
}
public string Send(string Cmd)
{
Cmd = Cmd.ToUpper();
byte[] sendBytes = Encoding.ASCII.GetBytes(Cmd);
try
{
if (ValidateCmd(Cmd))
{
_serialPort.WriteLine(Cmd);
if (_echo)
{
return "ECHO: " + Cmd;
}
}
}
catch (Exception ex)
{
throw ex;
}
return string.Empty;
}
private bool ValidateCmd(string Cmd)
{
return true;
}
public void Dispose()
{
_serialPort.Close();
_serialPort.Dispose();
}
}
public struct PortDefinitions
{
public string PortName { get; set; }
public int BaudRate { get; set; }
public Parity Parity { get; set; }
public StopBits StopBits { get; set; }
public int DataBits { get; set; }
public Handshake Handshake { get; set; }
public int ReadTimeout { get; set; }
public int WriteTimeout { get; set; }
public bool Echo { get; set; }
public static PortDefinitions GetDefaults(string PortName)
{
return new PortDefinitions()
{
PortName = PortName.ToUpper(),
BaudRate = 9600,
Parity = Parity.None,
StopBits = StopBits.One,
DataBits = 8,
Handshake = Handshake.None,
ReadTimeout = 1000,
WriteTimeout = 1000,
Echo = true
};
}
}
}
Устройство является проприетарным, но оно принимает следующие команды:
InX
OutY
(где X и Y — порты на устройстве, и создается соединение между входным и выходным портами)Status All
(показывает состояние всех входов
Write
вместоWriteLine
, и вручную добавьте\r\n
для новых строк, а затем опубликуйте фактические байты (в десятичном или шестнадцатеричном формате), отправленные и полученные. - person Gabe   schedule 26.03.2014