2016-12-05 130 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(); 

      } 

     }