Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从.NET发送和接收到串行设备“;例如;VT 100_C#_.net_Vt100 - Fatal编程技术网

C# 从.NET发送和接收到串行设备“;例如;VT 100

C# 从.NET发送和接收到串行设备“;例如;VT 100,c#,.net,vt100,C#,.net,Vt100,我有一个串行设备,用于接收和回复来自VT100型终端的命令。我可以使用任意数量的“终端模拟器”来操作这个设备。但是我想做的是从一个.NET Windows应用程序发送一系列命令,并从同一个应用程序接收回复,这样我就可以驱动一个对操作员来说非常简单的GUI。我不想要的是另一个终端模拟器。似乎使用“System.IO.Serial.SerialPort”我可以打开连接、发送消息、指定一个代理来接收消息、实际接收消息……但我发送的消息(命令)并没有按我预期的方式解释(当我用终端仿真器检查设备的状态时,

我有一个串行设备,用于接收和回复来自VT100型终端的命令。我可以使用任意数量的“终端模拟器”来操作这个设备。但是我想做的是从一个.NET Windows应用程序发送一系列命令,并从同一个应用程序接收回复,这样我就可以驱动一个对操作员来说非常简单的GUI。我不想要的是另一个终端模拟器。似乎使用“System.IO.Serial.SerialPort”我可以打开连接、发送消息、指定一个代理来接收消息、实际接收消息……但我发送的消息(命令)并没有按我预期的方式解释(当我用终端仿真器检查设备的状态时,状态与通过.Net发送的命令不匹配),并且我收到的消息的格式不是我可以破译的

我认为我需要做的是正确地编码命令并正确地解码响应…但我找不到任何文档可以清楚地解释如何做到这一点

(我在C#工作,但任何.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是设备上的端口,并创建了连接。) 在输入端口和输出端口之间)
状态全部
(显示所有端口的状态 输入


您的换行定义设置错误。您有
newline=“/N”
,但您几乎肯定需要它是
“\r\N”
”\N

您使用的是什么代码?请发布它,以及您所连接的设备的任何信息。例如波特率、数据位、停止位等。听起来您正在与一个期望与VT100通话的设备通话,所以您编写的代码本质上是假装为VT100,对吗?您应该ld向我们展示您拥有的代码以及发送/接收的实际字节以及您认为它们应该是什么意思。@Gabe,更正我正在尝试创建一个应用程序,该应用程序将在后端“模拟”VT 100(有效命令的范围有限)和一个简单的用户界面…+1用于提及“VT100”您需要发布发送的字节数和接收的字节数。谢谢……我感谢您对这一点的更正,但它似乎并不能解决我的问题。@Coscalis:哪些值不起作用?我知道
/N
,但还有什么?感谢您在这方面的帮助。发现问题不是命令集,而是发送命令的速率。设备无法处理该流。