Announcement

Collapse
No announcement yet.

open comport -> socket write

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • open comport -> socket write

    Hallo Leute,

    ich schreibe meine Sachen fast ausschließlich in Flex und php.
    Nun geht es nicht mehr und ich habe angefangen mich mit C# zu beschäftigen.
    Der Socket funktioniert.
    Ich kann von Flex aus connectieren und das Echo empfangen.
    Super.
    Nur das einfachste bekomme ich nicht gebacken.
    Vermutlich habe ich hier noch ein Verständnisproblem.
    Ich bekomme schon keine Instanzt vom seriellen Port!

    PHP Code:
    using System;
    using System.Collections;
    using System.Net;
    using System.Net.Sockets;
    using System.Text;
    using System.Diagnostics;
    using System.IO.Ports;


    namespace 
    TcpSock
    {
        class 
    TcpSock
        
    {
            
    //static SerialPort _serialPort;
            //_serialPort = new _serialPort();
            //_serialPort = new _serialPort("COM3", 9600, Parity.None, 8, StopBits.One);
            
    int tcpIndx 0;
            
    int tcpByte 0;
            
    byte[] tcpRecv = new byte[1024];
            public 
    Socket tcpSock;
     

            public 
    int Recv(ref string tcpRead)
            {
                
    tcpByte tcpSock.Available;
                if (
    tcpByte tcpRecv.Length tcpIndx)
                    
    tcpByte tcpRecv.Length tcpIndx;

                
    tcpByte tcpSock.Receive(tcpRecvtcpIndxtcpByte,SocketFlags.Partial);
                
    tcpRead Encoding.ASCII.GetString(tcpRecvtcpIndxtcpByte);
                
    tcpIndx += tcpByte;
                return 
    tcpRead.Length;
            }

            public 
    int RecvLn(ref string tcpRead)
            {
                
    tcpRead Encoding.ASCII.GetString(tcpRecv0tcpIndx);
                
    tcpIndx 0;
                return 
    tcpRead.Length;
            }

            public 
    int Send(string tcpWrite)
            {
                return 
    tcpSock.Send(Encoding.ASCII.GetBytes(tcpWrite));
            }

            public 
    int SendLn(string tcpWrite)
            {
                return 
    tcpSock.Send(Encoding.ASCII.GetBytes(tcpWrite "\r\n"));
            }
        }

        class 
    Tcp
        
    {
            [
    STAThread]
            static 
    void Main()
            {
                
             

                
    IPHostEntry Iphe Dns.Resolve(Dns.GetHostName());

                
    //string myHost = Dns.GetHostName();
                //IPHostEntry Iphe = Dns.GetHostByName(Dns.GetHostName).AddressList(0).ToString();
                
                
                
    IPEndPoint Ipep = new IPEndPoint(Iphe.AddressList[0], 4444);
                
    Socket Server = new Socket(Ipep.Address.AddressFamily,
                
    SocketType.StreamProtocolType.Tcp);

                
    ArrayList Client = new ArrayList();
                
    string rln null;

                
    Client.Capacity 256;
                
    Server.Blocking false;
                
    Server.Bind(Ipep);
                
    Server.Listen(32);

                
    Console.WriteLine("{0}: listening to port {1}"Dns.GetHostName(),Ipep.Port);

                
    ////////////////////////////////////////////////////////////////////////////////////////////
                ///Main loop
                ///1. Poll the Server TcpSock; if true then accept the new connection.
                ///2. Poll the Client TcpSock; if true then receive data from Clients.

                
    while (true)
                {
                    
    //Accept
                    
    if (Server.Poll(0SelectMode.SelectRead))
                    {
                        
    int i Client.Add(new TcpSock());
                        ((
    TcpSock)Client[i]).tcpSock Server.Accept();
                        ((
    TcpSock)Client[i]).SendLn("Welcome");
                        
    Console.WriteLine("Client {0} connected."i);
                    }

                    for (
    int i 0Client.Counti++)
                    {
                        
    //check for incoming data
                        
    if (((TcpSock)Client[i]).tcpSock.Poll(0SelectMode.SelectRead))
                        {
                            
    //receive incoming data
                            
    if (((TcpSock)Client[i]).Recv(ref rln) > 0)
                            {
                                
    //echo incoming data
                                
    ((TcpSock)Client[i]).Send(rln);
                                
    //Debug.Write(rln);
                               
                                
                                
    if (rln.Substring(03) == "set")
                                {
                                    
    Debug.Write("set");
                                    
    // hier daten an comport senden
                                
    }
                                if (
    rln.Substring(03) == "get")
                                {
                                    
    Debug.Write("get");
                                    
    //hier daten via socket an flex zurück 
                                    // string message = _serialPort.ReadLine()
                                    //((TcpSock)Client[i]).Send(message);
                                    
                                
    }

                                
    /*
                                //check for new line
                                if (rln == "\r\n")
                                {
                                    ///receive line
                                    ((TcpSock)Client[i]).RecvLn(ref rln);

                                    //send the line to all clients
                                    for (int y = 0; y < Client.Count; y++)
                                        if (y != i)
                                            ((TcpSock)Client[y]).Send(i.ToString() + ": " + rln);

                                    Console.Write("{0}: {1}", i, rln);
                                }
                                 * */
                            
    }


                            
    //recv returned <= 0; close the socket
                            
    else
                            {
                                ((
    TcpSock)Client[i]).tcpSock.Shutdown(SocketShutdown.Both);
                                ((
    TcpSock)Client[i]).tcpSock.Close();
                                
    Client.RemoveAt(i);
                                
    Console.WriteLine("Client {0} disconnected."i);
                            }
                        }
                    }
                }
            }
        }


  • #2
    Code:
    _serialPort = new _serialPort("COM3", 9600, Parity.None, 8, StopBits.One);
    richtig:

    Code:
    using System.IO.Ports;
    
    ...
    
    SerialPort serialPort = new SerialPort(...);
    serialPort.Open();
    So kanns definitiv nicht gehen, weil es die Klasse _serialPort wohl nicht gibt.

    Ansonsten kann ich Dich nur hierhin verweisen.

    Einen seriellen Port muss man auch mit _serialPort.Open() öffnen. Er ist nicht automatisch offen. Vielleicht hängts auch da.

    Comment


    • #3
      An dem liegt es nicht!
      Das habe ich alles schon versucht.
      nach
      PHP Code:
      static SerialPort _serialPort;
      _serialPort = new SerialPort(); 
      ist schon Schluss.
      wie Du sehen kannst habe ich die using Dirctive mit drin
      PHP Code:
      using System.IO.Ports
      Das sind die Fehler die ich nicht verstehe und auch nicht raus bringe.
      Ich habe hier ein ganz anderes Problem. Einen Denkfehler!!

      Fehler 2 Ungültiges Token "=" in Klasse, Struktur oder Schnittstellenmemberdeklaration. C:\Dokumente und Einstellungen\oliver\Eigene Dateien\Visual Studio 2008\Projects\serialProxy\serialProxy\Program.cs 16 22 serialProxy
      Das bezieht sich auf das = in "_serialPort = new SerialPort()"

      Fehler 3 Die Methode muss einen Rückgabetyp besitzen. C:\Dokumente und Einstellungen\oliver\Eigene Dateien\Visual Studio 2008\Projects\serialProxy\serialProxy\Program.cs 16 28 serialProxy

      Das Problem was ich habe hängt nicht an meinen 2 Zeilen, oder?

      LG Olli

      Comment


      • #4
        warum is denn der SerialPort static? Ich denke das kann so nicht ganz gewollt sein. Jede Instanziierung eines neuen Objekts der Klasse TcpSock würde demnach den serialPort überschreiben.

        static heisst nicht readonly! siehe hier

        Ansonsten kann ich leider nicht weiter helfen, da scheint sich ja zu dem Code am Anfang schon wieder was geändert zu haben.

        Comment


        • #5
          Hallo,

          geändert hat sich da nichts.
          Mein Problem ist dass ich sofort eine Fehlermeldung bekomme und ich nicht weiss warum?
          Egal ob static oder nicht, ich versuche seit geraumer zeit jedes Beispiel.

          Die socketgeschichte geht ja. Aber bei dem Comport beisst es aus.

          in einem anderen Projekt geht es, hier nicht.
          Kopier mal den ersten Code und versuche die 2 Zeilen für den Comport einzufügen.
          Geht nicht, auch nicht die Beispiele von MSDN etc.
          Habe alles schon durch.

          LG Olli

          Comment


          • #6
            Ich habs eben bei mir selbst versucht und folgendes lässt sich übersetzen. Ich kanns nur leider nicht testen, weil ich nichts da hab was ich ansteuern könnte.

            [highlight=c#]
            using System;
            using System.Collections.Generic;
            using System.Linq;
            using System.Text;
            using System.IO.Ports;

            namespace SerialPortTest
            {
            public class SerialPortTester
            {
            private SerialPort _serialPort;

            public SerialPortTester()
            {
            _serialPort = new SerialPort("COM1");
            }

            public void OpenSerialPort()
            {
            _serialPort.Open();
            }

            public void Send(Byte[] bytesToSend)
            {
            _serialPort.Write(bytesToSend,0,bytesToSend.Count( ));
            }
            }
            }
            [/highlight]


            So kannst du das übrigens nicht schreiben:

            [highlight=c#]
            public class TcpSock
            {
            static SerialPort _serialPort;
            _serialPort = new SerialPort();
            }
            [/highlight]

            Das macht gar keinen Sinn Wenn dann so:

            [highlight=c#]
            public class TcpSock
            {
            static SerialPort _serialPort = new SerialPort();
            }
            [/highlight]

            oder so:

            [highlight=c#]
            public class TcpSock
            {
            static SerialPort _serialPort;

            public TcpSock()
            {
            _serialPort = new SerialPort();
            }
            }
            [/highlight]

            Und ich würde mir nochmal genau die Definition von static anschauen. Wenn es etwas nur einmal geben darf würde ich Dir zum Singleton pattern raten.
            Zuletzt editiert von fanderlf; 17.02.2010, 14:20.

            Comment

            Working...
            X