• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

c# Websocket Server Fehlermeldung

xorg1990

New member
Hi, hoffe her gibt es c#'ler.

Ich arbeite gerade an einer WebSocket zu COM Port Bridge.
Der Server basiert auf Fleck:
https://github.com/statianzo/Fleck

Wenn ich aber die Verbindung schließe erhalte ich diese Fehlermeldung:
System.NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
bei COM.WEBSocket.onClose() in C:\Users\****\Documents\Visual Studio 2015\Projects\COM\COM\WEBSocket.cs:Zeile 67.

In Zeile 67 steht:
if (serialPort.IsOpen)

Ist das eine erstes Problem oder kann ich das ignorieren? Anwendung läuft problemlos weiter die Com Port Funktionalität ist noch nicht überprüft.

Code:
using System;
using System.IO.Ports;
using Fleck;
using System.Diagnostics;

namespace COM
{
    public static class WEBSocket
    {
        private static IWebSocketConnection connection = null;
        private static SerialPort serialPort;
        private static int pid = 0;

        public static void start(int id, string port)
        {
            pid = id;
            var server = new WebSocketServer("ws://127.0.0.1:"+port);
            server.RestartAfterListenError = true;
            server.SupportedSubProtocols = new[] { "COM" };
            server.Start(socket =>
            {
                socket.OnOpen = () => onOpen(socket);
                socket.OnMessage = message => onMessage(message);
                socket.OnClose = () => onClose();
            });
        }

        private static void onOpen(IWebSocketConnection sock)
        {
            if (connection == null)
            {
                connection = sock;
                string[] ports = SerialPort.GetPortNames();
                string Ports = String.Join(",", ports);
                connection.Send(Ports);
            }
        }
        private static void onMessage(string message)
        {
            //message will be "comPort, dtrOrRTS, onOrOff";
            Char delimiter = ',';
            string[] ports = message.Split(delimiter);
                serialPort = new SerialPort(ports[0]);
                if (ports[2] == "on")
                {
                    if (ports[1] == "dtr")
                    {
                        serialPort.DtrEnable = true;
                        serialPort.RtsEnable = false;
                    }
                    else
                    {
                        serialPort.DtrEnable = false;
                        serialPort.RtsEnable = true;
                    }
                    serialPort.Open();
                }
                else //off
                {
                    serialPort.Close();
                }
        }
        private static void onClose()
        {
            try
            {
                if (serialPort.IsOpen)
                {
                    serialPort.Close();
                    // Process p = Process.GetProcessById(pid);
                    // p.Kill();
                }
            }catch(Exception ex)
            {
                Console.WriteLine(ex);
                // Process p = Process.GetProcessById(pid);
                // p.Kill();
            }
            connection = null;
        }
    }
}

Asso, das ganze wird als dll compiliert.
 
versuch mal if (serialPort && serialPort.IsOpen), das bedeutet dann aber, daß vorher was schief gelaufen ist, oder dass keine msg gekommen ist
 
Das geht nicht, da steht "der && Operator kann nicht auf Operanten vom Typ "SerialPort und "bool" angewendet werden" "
if (serialPort == true && serialPort.IsOpen == true) kommt das selbe bei raus.

- - - Aktualisiert - - -

Alls klar c# muss man serialPort != null schrieben.

- - - Aktualisiert - - -

Ok, die Fehlermeldung ist nun weg. Das bedeutet am ende das Serial Port nicht existiert hat? Logisch wen kein OnMessage kommt.
 
Habe ein neues Problem. Und zwar setzt die Close Funktion nicht den dtr/rts Status zurück. Einmal auf high immer auf high. Erst wenn ich das Programm Schließe ist alles aus.
Irgendwelche Ideen?

- - - Aktualisiert - - -

Sehe noch ein ein Problem... es macht kein sin einen neuen Serial Port bei jedem OnMessage event zu erstellen.
 
So, habe den Code noch mal Überarbeitet, nur wird jetzt gar nix mehr auf high gesetzt:confused:

Die Sache ist die, der Test gestern war bei einem Kumpel mit einem Hardware Com Port. Da ich auf den Laptop keinen habe, nutze ich einen USB zu RS232 Adapter, weiß nicht ob das eine Rolle spielt? Erkannt wird der Adapter unter COM4. Der Adapter funktionier auch, dass habe ich in einer C geschrieben Software getestet.

Vielleicht über sehe ich auch was:
Code:
using System;
using System.IO.Ports;
using Fleck;

namespace COM
{
    public static class WEBSocket
    {
        private static IWebSocketConnection connection = null;
        private static SerialPort serialPort = null;
        private static int pid = 0;
        private static string strPort ="COM0";
        private static string wsPort;

        public static void start(int id, string port)
        {
            pid = id;
            wsPort = port;
            var server = new WebSocketServer("ws://127.0.0.1:"+port);
            server.RestartAfterListenError = true;
            server.SupportedSubProtocols = new[] { "COM" };
            server.Start(socket =>
            {
                socket.OnOpen = () => onOpen(socket);
                socket.OnMessage = message => onMessage(message);
                socket.OnClose = () => onClose();
            });
        }

        private static void onOpen(IWebSocketConnection sock)
        {
            if (connection == null)
            {
                connection = sock;
                string[] ports = SerialPort.GetPortNames();
                string Ports = String.Join(",", ports);
                connection.Send(Ports);
            }
        }
        private static void onMessage(string message)
        {
            //message will be "comPort, dtrOrRTS, onOrOff";
            Char delimiter = ',';
            string[] ports = message.Split(delimiter);

            if (serialPort == null || ports[0] != strPort)//port ist null oder ein anderer 
            {
                strPort = ports[0];
                if (serialPort != null && serialPort.IsOpen)//alter port ist  offen/schieße ihn erstelle neuen
                {
                    serialPort.DtrEnable = false;
                    serialPort.RtsEnable = false;
                    serialPort.Close();
                    serialPort = null;
                    serialPort = new SerialPort(ports[0]);
                }
                else
                {
                    serialPort = new SerialPort(ports[0]);
                }
            }
            if (ports[2] == "on")
                {
                    if (ports[1] == "dtr")
                    {
                        serialPort.DtrEnable = true;
                        serialPort.RtsEnable = false;
                    }
                    else
                    {
                        serialPort.DtrEnable = false;
                        serialPort.RtsEnable = true;
                    }
                serialPort.Open();
                }
                else //off
                {
                if(serialPort.IsOpen)//sicherheitshalber
                {
                    serialPort.DtrEnable = false;
                    serialPort.RtsEnable = false;
                    serialPort.Close();
                    serialPort = null;
                }
                }
        }
        private static void onClose()
        {
            try
            {
                if (serialPort != null && serialPort.IsOpen == true)
                {
                    serialPort.DtrEnable = false;
                    serialPort.RtsEnable = false;
                    serialPort.Close();
                    serialPort = null;
                    // Process p = Process.GetProcessById(pid);
                    // p.Kill();
                }
            }catch(Exception ex)
            {
                Console.WriteLine(ex);
                // Process p = Process.GetProcessById(pid);
                // p.Kill();
            }
            connection = null;
        }
    }
}

- - - Aktualisiert - - -

Asso, die Open Methode ist hier noch falsch, die kann auch gleich hinter die Serialport instanzierung. Ändert aber an der Tatsache nix... es geht einfach nicht.
 
tsseh schrieb:
noch ein tip: debugen hilft immer
Hab ich gemacht und bin dahinter gekommen, das das OnMessage event nicht gefeuert wurde. Warum weiß ich nicht im Browser stand keine Fehlermeldung, die Befehle gingen alle ab.

Jetzt geht es, komischerweise.
 
Zurück
Oben