2016-12-05 11 views
-2

einzugeben Ich erhalte eine Ausnahme, die besagt, dass Objekt des Typs 'System.IO.Ports.SerialStream nicht umwandeln kannSystem.Net.Sockets.NetworkStreamKann Objekt vom Typ 'System.IO.Ports.SerialStream' nicht umwandeln, um 'System.Net.Sockets.NetworkStream'

'geben', wenn ich unten Code ausführen

bitte geben Lösung, wie diese zu überwinden.

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; 
       } 
     } 

Antwort

2

C# ist eine typsichere Sprache. Das bedeutet, dass Sie keinen Ausdruck eines Typs einer Variablen eines anderen Typs zuweisen können und erwarten, dass sich die Typen automatisch anpassen (im Gegensatz zu einigen schwach typisierten Sprachen wie JavaScript). Während NetworkStream und SerialStream eine gemeinsame Basisklasse teilen (Stream), ist eine NetworkStreamnicht eine SerialStream und wird es nie sein. Du kannst also nicht zum anderen greifen. Die SerialPort.BaseStream Eigenschaft ist vom Typ Stream und das ist die Garantie, die diese Eigenschaft Ihnen gibt. Sie können versuchen, in einen anderen Typ (wie NetworkStream) zu werfen, aber wenn der Strom tatsächlich ein NetworkStream ist, wird dies fehlschlagen. Leider ist der Stream, der von der SerialPort-Klasse zurückgegeben wird, kein Netzwerkstream und der Stream-Typ, auf den er lautet (SerialStream), ist für Sie nicht zugänglich, da it is marked internal. Sie können es also nicht in beliebige Typ, der Ihnen zur Verfügung steht.

Ihre einzige Wahl in diesem Fall ist die Besetzung fallen zu lassen und Ihre Methode ein Stream machen zurückzukehren, anstatt eine NetworkStream:

private Stream GetStreams_USB_SER() 

und

return Is; 
+0

tatsächliches Problem in Strom gibt es nur keine DataAvailable Methode ist ich brauche darin –

+0

So Network –

+0

Sie können nicht Ihre Arten wählen, basierend auf den Methoden, die Sie benötigen. Sie müssen also einen anderen Weg finden, ohne DataAvailable zu gehen. Normalerweise verwenden Sie einen StreamReader, um Ihre Daten zu lesen. Auf diese Weise müssen Sie nicht auf Low-Level-Stream-Methoden zugreifen. – Sefe

0

ich eine neue Klasse geschaffen, die die überschreibt NetworkStream-Klasse, in der meine serielle Schnittstelle Funktionen implementiert.

 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(); 

      } 

     } 
Verwandte Themen