VT100 형식 터미널에서 명령을 수신하고 회신하도록 설계된 직렬 장치가 있습니다. 이 장치를 작동시키는 데 필요한 수의 '터미널 에뮬레이터'를 사용할 수 있습니다. 하지만 내가하고 싶은 것은 닷넷 윈도우 애플리케이션에서 일련의 명령어를 보내고 동일한 애플리케이션으로 응답을 수신하여 운영자에게 '단순한 먼지'가 될 GUI를 구동 할 수 있도록하는 것이다. 내가 싫어하는 것은 다른 터미널 에뮬레이터입니다. "System.IO.Serial.SerialPort"를 사용하여 연결을 열고, 메시지를 보내고, 대리인에게 메시지를 받도록 할당 할 수 있습니다. 실제로 메시지를받습니다. 그러나 보내지는 메시지 (명령)는 아닙니다. (내가 터미널 에뮬레이터로 장치의 상태를 검사 할 때 상태가 .Net을 통해 전송 된 명령과 일치하지 않습니다.) 예상 한대로 해석되고 수신 한 메시지가 해독 할 수있는 형식이 아닙니다.직렬 장치에 .NET에서 보내기 및 받기 "VT"처럼 "012"
필자가해야 할 일은 명령을 올바르게 인코딩하고 응답을 적절하게 디코딩하는 것입니다. 그러나이를 수행하는 방법을 명확하게 설명하는 문서는 찾을 수 없습니다.
내가 함께 일하고 코드는 다음이 프로토 타입 (나는 C#에서 일하고 있어요, 그러나 어떤 닷넷 예를 들어 주시면 감사하겠습니다) :
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
};
}
}
}
장치는 독점, 하지만 허용하는 명령은, (X 및 Y는 장치의 포트가 있으며 연결이있어서 상기 출력 포트 사이 생성된다)
OutY
InX
는Status All
는 (모든 의 상태를 도시 입력
어떤 코드를 사용하고 있습니까? 게시 할 장치 및 연결하려는 장치에 대한 정보를 게시하십시오. 예를 들어 보오율, 데이터 비트, 스톱 비트 등 –
VT100과 대화 할 것으로 예상되는 장치와 통화하는 것처럼 들리므로 VT100 인 척하는 코드를 작성하고있는 것입니다. 가지고있는 코드와 송수신 된 실제 바이트 및 의미해야한다고 생각하는 것을 보여 주어야합니다. – Gabe
@Gabe, correct 나는 올바른 명령의 제한된 범위와 함께 백엔드에서 VT 100을 '에뮬레이트'하는 앱을 만들고 사용자를위한 간단한 UI를 만들려고 노력 중입니다 ... –