2016-12-05 128 views
-2

我收到一个异常,说无法投射'System.IO.Ports.SerialStream为键入'System.Net.Sockets.NetworkStream无法投入'System.IO.Ports.SerialStream'类型的对象来键入'System.Net.Sockets.NetworkStream

当我运行下面的代码

请给出解决方案如何克服这一点。

private NetworkStream GetStreams_USB_SER() 
     { 
      sp = new SerialPort(); 
      NetworkStream Ns ;//= new NetworkStream(); 

      Stream Is; 
      String KEYNAME3 = "HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM"; 
       string COMPORT = (string)Registry.GetValue(KEYNAME3, "\\Device\\USBSER000", "NOT VALID COM"); 
       Console.WriteLine("\nOutput3: " + COMPORT); 
       sp.PortName = COMPORT; 
       sp.BaudRate = 115200; 
       //serialport.ReadTimeout = 1000; 
       sp.Open(); 
       if (sp.IsOpen) 
       { 
        Console.WriteLine("Port Detected :"); 
        Is = sp.BaseStream; 

        return (NetworkStream)Is; 
       } 
       else 
       { 
        return null; 
       } 
     } 

回答

2

C#是一个类型安全语言。这意味着你不能将一个类型的表达式赋值给一个不同类型的变量,并期望这些类型自动调整(而不是像JavaScript这样的弱类型语言)。虽然NetworkStreamSerialStream共享一个公共基类(Stream),但NetworkStream不是 a SerialStream而且将永远不会。所以你不能投一个到另一个。

SerialPort.BaseStream属性是Stream类型,这是该属性给你的保证。您可以尝试将其转换为其他类型(例如NetworkStream),但除非流实际上是 a NetworkStream,否则将失败。唉,由SerialPort类返回的流不是网络流,它的流类型(SerialStream)无法访问,因为it is marked internal。因此,您无法将其投入任何可供您使用的类型。

你在这种情况下,唯一的选择就是放弃投,让你的方法返回的Stream代替NetworkStream

private Stream GetStreams_USB_SER() 

return Is; 
+0

实际的问题是在它里面没有DataAvailable方法 –

+0

因此,只有我需要的NetworkStream –

+0

根据你所需要的方法,你不能选择你的类型。所以你必须找到另一种没有DataAvailable的方法。通常你使用StreamReader来读取你的数据。这样你就不需要访问低级别的流方法。 – Sefe

0

我创建了一个新的类,它覆盖NetworkStream类实现了我的串口功能。在流

 public class USB_COMM 
     { 
      static private SerialPort SPRT = new SerialPort(); 
      static String ComPortName = ""; 
      static int BaudRate = 0; 
      public USB_COMM(String sCOMNAME, int iBaudRate) 
      { 
       ComPortName = sCOMNAME; 
       BaudRate = iBaudRate; 
       Sckt1 = new Socket(SocketType.Stream,ProtocolType.Tcp); 
       Server(); 
       Sckt1.Connect(IPAddress.Parse("127.0.0.1"), 5000); 
       mns= new myStream(); 
      } 
     public NetworkStream NsGetUsbStrm() 
     { 
      return mns; 
     } 


      private class myStream : NetworkStream 
      { 
       public myStream() 
        : base(Sckt1) 
       { 
        SPRT.PortName = ComPortName; 
        SPRT.BaudRate = BaudRate; 
       } 
       public int iOpenPort() 
       { 
        try { 
         SPRT.Open(); 
         return 0; 
        } 
        catch 
        { 
         return 1; 
        } 
       } 
       public override bool DataAvailable 
       { 
        get 
        { 
         int AvilBytes = SPRT.BytesToRead; 
         if (AvilBytes > 0) 
         { 
          return true; 
         } 
         else 
         { 
          return false; 
         } 
        } 
       } 
       protected override void Dispose(bool disposing) 
       { 
        base.Dispose(disposing); 
       } 
       public override int Read(byte[] buffer, int offset, int size) 
       { 

        if (buffer == null || offset < 0 || size < 0) 
        { 
         throw new ArgumentException(); 
        } 
        if (!SPRT.IsOpen) 
         SPRT.Open(); 
        return SPRT.Read(buffer, offset, size); 
        //return base.Read(buffer, offset, size); 
       } 
       public override void Write(byte[] buffer, int offset, int size) 
       { 

        if (buffer == null || offset < 0 || size < 0) 
        { 
         throw new ArgumentException(); 
        } 
        if (!SPRT.IsOpen) 
         SPRT.Open(); 
        SPRT.Write(buffer, offset, size); 
        //base.Write(buffer, offset, size); 
       } 
      } 
      private void Server() 
      { 
       const int PORT_NO = 5000; 
       const string SERVER_IP = "127.0.0.1"; 

       //---listen at the specified IP and port no.--- 
       IPAddress localAdd = IPAddress.Parse(SERVER_IP); 
       TcpListener listener = new TcpListener(localAdd, PORT_NO); 
       Console.WriteLine("Listening..."); 
       listener.Start(); 

      } 

     }