2014-03-25 4 views
0

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 InXStatus All는 (모든 의 상태를 도시 입력

+0

어떤 코드를 사용하고 있습니까? 게시 할 장치 및 연결하려는 장치에 대한 정보를 게시하십시오. 예를 들어 보오율, 데이터 비트, 스톱 비트 등 –

+0

VT100과 대화 할 것으로 예상되는 장치와 통화하는 것처럼 들리므로 VT100 인 척하는 코드를 작성하고있는 것입니다. 가지고있는 코드와 송수신 된 실제 바이트 및 의미해야한다고 생각하는 것을 보여 주어야합니다. – Gabe

+0

@Gabe, correct 나는 올바른 명령의 제한된 범위와 함께 백엔드에서 VT 100을 '에뮬레이트'하는 앱을 만들고 사용자를위한 간단한 UI를 만들려고 노력 중입니다 ... –

답변

2

개행 정의가 잘못 설정되었습니다. NewLine = "/N"이 있지만 거의 확실하게 "\r\n" 또는 "\n"이 필요합니다.

+0

감사합니다 ...이 시점에서 수정 주셔서 감사하지만 내 문제를 해결하려면 나타나지 않습니다. –

+0

@CosCallis : 어떤 값이 작동하지 않습니까? 나는'/ N'을 안다. 그러나 그 밖의 무엇? – Gabe

+0

도움을 주셔서 감사합니다. 문제가 명령 집합이 아니라 명령이 전송되는 속도라는 것을 알게되었습니다. 장치가 흐름을 처리 할 수 ​​없습니다. –