Laden...
D
Daniel83 myCSharp.de - Member
Bielefeld Deutschland Dabei seit 05.02.2008 171 Beiträge
Benutzerbeschreibung

Forenbeiträge von Daniel83 Ingesamt 171 Beiträge

10.03.2008 - 15:02 Uhr

Habe die Anwendung auf einem Controlpanel, welchem ich zu Testzwecken über ein Programm auf dem PC via Comport telegramme zuschicke.
D.h. wenn ich von meinem PC das erste Telegramm schicke wird in jedem Fall richtig reagiert.
Habe ich die MessageBox im Code drin, wird auf jedes Protokol das ich sende erst mit der MessageBox und danach entsprechend der darauf folgenden Rutine reagiert.
Nehme ich die MessageBox heraus, so wird immer noch auf das erste Telegramm reagiert, (auch richtig) jedoch nicht unbedingt auf das darauf folgenden.
Also drücke ich in meinem Programm zum Senden wiederholt auf den Senden Button. Das Programm auf dem ControlPanel, also das welches diese Telegramme auswerten soll, reagiert dann nur noch manchmal. Dabei ist es egal, ob ich einige Sekunden Pause mache oder sehr schnell klicke.
Mal reagiert das Programm auf zwei aufeinander folgende Protokolle, mal macht es 10 oder 20 mal Senden gar nichts.

Ablauf:
Senden Reaktion
Protokoll Ja
Protokoll Nein
Protokoll Nein
Protokoll Nein
Protokoll Ja
Protokoll Ja
Protokoll Nein
...

Ich hoffe das ich so das Phänomen erschöpfend beschrieben habe.

10.03.2008 - 14:23 Uhr

Hallo zusammen

Ich habe ein unerklärliches Verhalten in folgendem Aufruf.

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
                string str = serialPort1.ReadExisting();
                //MessageBox.Show(str);
                BeginInvoke(new auswertung_delegate(auswertung), str);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            serialPort1.DiscardInBuffer();
        }

Wenn ich die hier auskommentierte Messagebox in den Ablauf hinein nehme, wird auf jedes Ereignis reagiert, also ich bekomme eine Ausgabe bei jedem mal wenn ich etwas schicke. Es reagiert wie erwartet. Alles ist gut, nehme ich nun die Messagebox heraus, so reagiert die Anwendung auf das erste Senden, und danach "beliebig". Beliebig heißt das mal nach jedem den 10. Senden, mal auf 2 aufeinander folgenden Sendungen.

Kann das mit Threading zu tun haben, oder ist es nur ein "Bug"?
Hat jemand eine Idee?

Danke schonmal

06.03.2008 - 12:09 Uhr

Aber das Debuggen ist total nervig, wel halt der schritt betrieb nicht vernünftig in VS funktioniert, oder zumindest bei meinen Anwendungen nicht hilft, weil ich da nichts über schnittstellen senden kann

06.03.2008 - 08:28 Uhr

Hi

Bench. Programiere auch unter Compact framework. Du kannst zu Testzwecken o.ä. deine exe auch unter Windows starten, auf deinem PC, was schwierig sein könnte ist dann die Port freiganbe oder sowas, wenn du das nicht dynamisch sondern für dein Mobiles gerät machst. aber nen spiel z.B.: geht ohne probleme.

Daniel

05.03.2008 - 14:22 Uhr

Habe jetzt mal einige hex zahlen zwischen 78h und A1h probiert. Es ergab folgendes Ergebnis:
Hex Dez
78 120 (richtig)
79 121 (richtig)
80 172
81 129
82 26
83 146
84 30
85 38
86 32
87 33
88 198
89 48
90 144
91 24
92 25
93 28
94 29
95 34
96 19
97 20
98 220
99 34
A0 160 (richtig)
A1 161 (richtig)

hier nach müsste also 95h == 99h sein, mein geschultes Auge sagt mir, das dies nicht sein kann.

Was ich mache, ich lese es ein via serialPort1.ReadExisting()
Ausgabe in einer for-Schleife


int i = 0;
for(;i<eingang.Length;i++)
{
     tb_ausgabe.Text += "[" + (byte)eingang[i]+"]";
}

eingang ist eine String Variable, wo die Daten drin sind.
umwandlung wie oben beschrieben mit

serialPort1.Encoding=Encoding.Default;//ANSI

hat einer eine Idee

Dieser Fehler ist nicht reproduzierbar, hatte gestern für
99h 63d
98h 63d
88h 63d
mehr hab ich gestern nicht geprüft.

04.03.2008 - 13:10 Uhr
switch (eingang[6])
                {
                   
                    case 0x67:
                        text = "Transaction Mbr follows";
                        break;
                    case 0x77:
                        text = "Reset UART-Baustein RS485";
                        break;
                    case 0x78:
                        text = "Anfrage Transponder ID";
                        break;
                    case 0x79:
                        text = "Anfrage Mandant";
                        break;
                    case 0x7A:
                        text = "Anfrage shared secret";
                        break;
                    case 0x7B:
                        text = "Anfrage Seriennummer";
                        break;
                    case 0x7C:
                        text = "Setze Transponder ID";
                        break;
                    case 0x7D:
                        text = "Setze Mandantendaten";
                        break;
                    case 0x7E:
                        text = "Setze shared secret";
                        break;
                    case 0x7F:
                        text = "Setze Seriennummer";
                        break;

                    case 0x91:
                        text = "Sabo / Zustand";
                        break;
                    case 0x92:
                        text = "Not Taster / Zustand";
                        break;
                    case 0x93:
                        text = "GMA / Zustand";
                        break;
                    case 0x94:
                        text = "Verriegelungs Alarm";
                        allert = true;
                        break;
                    case 0x95:
                        text = "Tür offen Alarm";
                        allert = true;
                        break;
                    case 0x97:
                        text = "Überwacht / Status";
                        break;
                    case 0x98:
                        text = "Verriegelungs Voralarm";
                        allert = true;
                        break;
                    case 0xAD:
                        text = "Zutritt erfolgt";
                        break;
                    case 0xB1:
                        text = "Falsche PIN";
                        break;
                    case 0xB3:
                        text = "Falsche Systemkennung";
                        break;

                    default:
                        text = "Kein gültiger Befehl";
                        allert = true;
                        break;
/*das ist ein Teil der Auswertung. Ich lasse mir zu dem noch den Inhalt des auszuwertenden Zeichens Ausgeben, somit kann ich also mit bestimmtheit sagen, was da nach der Umwandlung in ein Byte aus einem String drinnen steht*/

//Bei der Initialisierung des Serialport heißt es

serialPort1.Encoding=Encoding.Default;//ANSI

Alle anderen Cases funktionieren, nur nicht die mit 9
Kann mir eigentlich nicht vorstellen, dass ich einen Bug drinn habe, oder bin mal wieder Betriebsblind.
Ich versorge zur Zeit das Control Panel(WinCE) auf dem dieses Prog läuft, über einen Laptop via RS485 Converter und trace-Software mit Daten, Ich weiß also 100% was ich sende.

04.03.2008 - 12:54 Uhr

Schnell noch etwas Quelltext

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            
            try
            {
                string str = serialPort1.ReadExisting();
                BeginInvoke(new auswertung_delegate(auswertung),str);
                
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            
        }

 private void auswertung(string str)
        {
            eingang += str;
            bool allert = false;
            byte[] befehl ={ };
            string text;
if (befehl.Length >= 6)
            {
switch((byte)eingang[6])
//Auswertung mittels switch
}
}

Das war glaub ich alles, was relevant ist

04.03.2008 - 12:50 Uhr

Hallo zusammen

Aufgrund von Beiträgen habe ich inzwischen Rausgefunden, dass ich mit Ascii-Encoding nur werte bis 127 einlesen kann. Meine Werte sind jedoch großen. Habe jetzt Umgestellt auf ANSI-Encoding.
Es ist auch fast alles gut, bis auf die Werte die in hex eine 9 vorne haben also z.B.: 91,9A usw.
Dafür kriege ich relativ willkürliche Werte.
zb: 94=1D
95=22
96=13

Ich habe dummerweise ein vorgegebenes Protokol, welches auch Befehle mit 9 vorne beinhaltet.

Hat sowas schonmal jemand gehabt?

Danke schonmal

03.03.2008 - 13:57 Uhr

Hab das jetzt unter Kontrolle. Sieht aus wie folgt:

private void serialPort1_DataReceived(....)
{
     try
     {
          string str = serialPort1.ReadExisting();
          BeginInvoke(new auswertung_delegate(auswertung),str);
     }catch(Exception ex)
     {
           MessageBox.Show(ex.Message);
      }
}
private delegate void auswertung_delegate(string str);

private void auswertung(string str)
{
     tb_ausgabe.Text="Hello World";
}

Danke schön

03.03.2008 - 12:15 Uhr

Programmiere für Win CE MethodInvoker steckt im Namespace Microsoft.JScript, zumindest in der Hilfe die ich gesehen hab. Der Namespace oder zumindest die Funktion ist im Compact framework nicht enthalten

Alles zusammen läuft in der Klasse der Form1

03.03.2008 - 10:24 Uhr

Hallo zusammen

Ich hoffe ich bin mit meinem Problem hier richtig.

Ich habe ein Programm, dass von einem COM Port lesen soll. Im Grunde soll es den ganzen Trafic, der über einen RS 485 Bus läuft mitschreiben und entschlüsseln.
Jetzt habe ich folgenden Rutine.

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
                string str = serialPort1.ReadExisting();
                auswertung(str);
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
}


private void auswertung(string str)
        {
            tb_ausgabe.Text += "\n" + DateTime.Now + str;
}

es soll etwas eingelesen werden, wenn etwas zum lesen da ist.
Das Ereignis wird auch ausgelöst. Sehen ich über eine MessageBox, die inzwischen nicht mehr drin ist.
Ob etwas gelesen wird, kann ich leider nicht sehen, ist aber auch noch nicht so wichtig. Den Fehler den ich habe ist der,

Das eine Exception ausgelöst wird, wenn ich versuche in eine Textbox zu schreiben. die Meldung heißt:"An error message connot be displayed an optional resource assembly containing it cannot be found"

Das was ich einlese, will ich aber verarbeiten und auf grund dessen etwas anderes ausgeben, sollte also funktionieren.

Danke schonmal

26.02.2008 - 16:22 Uhr

Hallo

Ich hatte ein ähnliches Problem, jedoch waren das bei mir definierte anzahl von Zeichen. Guck mal hier COM Port nach. vieleicht siehst du da was

26.02.2008 - 14:56 Uhr

Hallo

Ich studiere auch E-Technik.

Ich habe jetzt bei der Arbeit, paralell zum Studium sowohl mit C# und C zu tun. Microcontroler sind recht komfortabel in C zu programmieren, alles was ein bischen hübsch aussehen soll, mache ich in C#, wenn du C# lernst, und paralell dazu guckst, wie einige Sachen in C funktionieren, fährst du glaub ich ganz gut. C nutzt du "nur" für "kleine" nicht so richtig komplizierte Programme, die Hardware nah sein müssen (Microcontroller) und ansonsten würde ich C# nehmen. so weit sind die Sprachen ja auch nicht auseinander.

Fazit: Basics von C beherschen
C# nen bischen mehr.

19.02.2008 - 12:09 Uhr

Danke schön, so läuft es.

19.02.2008 - 11:58 Uhr

Ich bekomme auch nicht 0 sonder mal 1 oder auch mal 3 Bytes als Rückgabe wert, wenn ich also mit der Schleife warte, ob nun mit oder ohne Thread.Sleep(1) ich kann ja auch nur ne leere Schleife verwenden, muss ich warten, bis es mindestens 6 Bytes sind

19.02.2008 - 11:50 Uhr

So ich habe jetzt eine schleife eingebaut

while(serialPort1.BytesToRead<6)
{
Thread.Sleed(1);
}

bekomme jetzt wohl auch das richtige Ergebnis, gibt es da eine elegantere Lösung?

private void empfangen()
        {
            readbuf[0] = 0;
            readbuf[1] = 0;
            readbuf[2] = 0;
            readbuf[3] = 0;
            readbuf[4] = 0;
            readbuf[5] = 0;
            //l_resive.Text = "bitte Warten";
            //if (serialPort1.BytesToRead > 0)
            //{

              
            //l_resive.Text = "CS hin " + sendbuf[5].ToString();
                while (serialPort1.BytesToRead<6)
                {
                    Thread.Sleep(1);
                    
                }
                serialPort1.Read(readbuf, 0, 6);
                l_send.Text = "Byte Null  "+readbuf[0].ToString() ;
                l_send.Text += " Byte 1 "+readbuf[1].ToString();
                l_send.Text+=" Byte 2 "+readbuf[2].ToString();
                l_send.Text += " Byte 3 " + readbuf[3].ToString();
                l_send.Text += " Byte 4 " + readbuf[4].ToString();
                l_send.Text += " CS " + readbuf[5].ToString();
                //checksum(readbuf);
                //l_resive.Text += "  " + sendbuf[5].ToString();*/
                
                
                if (readbuf[4] == 0)
                {
                    if (readbuf[0] != 0xf0)
                    {
                        l_resive.Text = "Übermittlung war erfolgreich";
                    }
                    else
                    {
                        l_resive.Text = "Cecksum falsch";
                    }

                }
                else
                {
                    l_resive.Text = "Fehler in der Übertragung";
                }
            //}
        }//end of Empfangen

Also so, wenn es Jemandem hilft

19.02.2008 - 11:38 Uhr

Beim ersten senden und empfangen erhalte ich 6Bytes, also korekte Antwort,
Bei den anderen senden und empfangen, also bei widerholten sende_button drücken empfange ich nur jeweils 1 Byte, das signal auf der Leitung bleibt aber das selbe.
Also Fehler beim Read(), und jetzt?

Anzahl Bytes in der Leitung != Anzahl Bytes von Read()

19.02.2008 - 10:58 Uhr
private void empfangen()
        {
            readbuf[0] = 0;
            readbuf[1] = 0;
            readbuf[2] = 0;
            readbuf[3] = 0;
            readbuf[4] = 0;
            readbuf[5] = 0;
                            if (serialPort1.IsOpen)
                {
                    serialPort1.Read(readbuf, 0, 6);
                }
                l_send.Text = "Byte Null  "+readbuf[0].ToString() ;
                l_send.Text += " Byte 1 "+readbuf[1].ToString();
                l_send.Text+=" Byte 2 "+readbuf[2].ToString();
                l_send.Text += " Byte 3 " + readbuf[3].ToString();
                l_send.Text += " Byte 4 " + readbuf[4].ToString();
                l_send.Text += " CS " + readbuf[5].ToString();

                
                
                if (readbuf[4] == 0)
                {
                    if (readbuf[0] != 0xf0)
                    {
                        l_resive.Text = "Übermittlung war erfolgreich";
                    }
                    else
                    {
                        l_resive.Text = "Cecksum falsch";
                    }

                }
                else
                {
                    l_resive.Text = "Fehler in der Übertragung";
                }
           
        }//end of Empfangen



private void senden()
        {
                if (!serialPort1.IsOpen)
                {
                    serialPort1.Open();
                }
                serialPort1.DiscardInBuffer();
                serialPort1.Write(sendbuf, 0, sendbuf.Length);
                l_send.Text = ("Message: " + cb_befehl.SelectedItem + " sent to Port " + s.PortName);
        }//end of senden

Hier nochmal die beiden Funktionen, zum Senden und Empfangen.

Wie bereits erwähnt, habe ich ein Problem mit dem Inhalt von readbuf[]

Das ist für mich nicht nachvollziehbar. In anderen Funktionen wird nur zur Auswertung (if oder switch) auf dieses Arrey zugegriffen, also entweder habe ich ein Komunikationsproblem vom COM-Port bis zu meiner Software, oder ich überschreibe es mir selber, jedoch wüsste ich nicht wo.

Vieleicht hatte mal jemand ein ähnliches Problem, oder sonst eine Idee.

@ svenson :Ist das so besser?

19.02.2008 - 10:50 Uhr

habe in der Funktion Senden(), also noch bevor ich zum meinem Gerät sende, woraufhin ich dann die Antwort bekomme, serialPort1.DiscardInBuffer(); eingefügt, sodass der eingangspuffer vor dem empfange geleert wird.

Nun erhalte ich in meinem readbuf[]

beim ersten Empfangen
6C 05 00 00 05 6C (Korekte Reaktion)
beim zweiten und den folgenden, also wenn ich mehrmals auf senden drücke,
6C 00 00 00 00 00
Es gab zwischendurch keine Änderung, das gesendete Protokoll ist immer
6C 05 00 00 05 6C

Vileicht hilft das

19.02.2008 - 09:05 Uhr

Hallo zusammen

Ich arbeite an einem Programm, das von einem Control Panel aus mit einem Steuergerät via COM Port komunizieren soll.
Das Control Panel schickt 6Bytes hin es wird eine Aktion hervor gerufen und es wird mit entsprechenden 6 Byte geantwortet.
Ich habe das gleiche Projekt für die Komunikation via UDP bereits Fertiggestellt und dort läuft es Fehlerfrei. Die Komunikation usw. funktioniert. Jedoch passieren komische Dinge.

Wenn ich eine bestimmte Abfrage schicke, bekomme ich eine Antwort. Ich gebe nun die ertsen vier erhaltenen Antworten hier an:

  1. 6C 05 00 00 05 6C
  2. 6C 00 00 00 00 00
  3. 05 00 00 05 6C 00
  4. 6C 05 00 00 05 6C

die 5. und die folgenden Antworten sind identisch mit Antwort 1 und 4.

Ich habe mich bereits mit einem Laptop und entsprechender Hard- und Software in die Leitung geklinkt und habe den Trafic mit geschrieben. Es wird immer die selbe Antwort gesendet, nämlich die 1. Das muss auch so sein. Der Fehler ist so auch reproduzierbar, hatte eben und Gestern exakt das gleiche Bild.

Hier nun der Code

private void fenster_Status()
        {
            sendbuf[0] = 0x6c;
            checksum(sendbuf);
            senden();
            empfangen();
            
                l_resive.Text = "Kein Fehler im Speicher";
                switch (readbuf[4])
                {
                    case 0xbb:
                        l_resive.Text += "\nFenster noch nicht initialisiert";
                        break;
                    case 0xc0:
                        l_resive.Text += "\nFenster nicht vorhanden";
                        break;
                    case 0x00:
                        l_resive.Text += "\nFenster ist verriegelt";
                        break;
                    case 0x01:
                        l_resive.Text += "\nFenster entriegelt in Kippstellung";
                        break;
                    case 0x02:
                        l_resive.Text += "\nFenster entriegelt in Kippstellung, Flügel liegt an";
                        break;
                    case 0x03:
                        l_resive.Text += "\nFenster öffnen in Kippstellung";
                        break;
                    case 0x04:
                        l_resive.Text += "\nFenster ist in Kippstellung teil geöffnet";
                        break;
                    case 0x05:
                        l_resive.Text += "\nFenster ist in Kippstellung voll geöffnet";
                        break;
                    case 0x06:
                        l_resive.Text += "\nFenster schließt von Kippstellung";
                        break;
                    case 0x07:
                        l_resive.Text += "\nFenster verriegelt von Kippstellung";
                        break;
                    case 0x08:
                        l_resive.Text += "\nFenster entriegelt in Drehstellung";
                        break;
                    case 0x09:
                        l_resive.Text+="\nFenster in Drehstellung Flügel liegt an";
                        break;
                    case 0x0a:
                        l_resive.Text+="\nFlügel kann manuell in Drehstellung geöffnet werden";
                        break;
                    case 0x0b:
                        l_resive.Text+="\nFlügel liegt an Fenster verriegelt von Drehstellung";
                        break;
                    default:
                        l_resive.Text+="\nunbekannter Status";
                        break;

                }//End of switch Z0 zustand
            if (readbuf[2] != 0)
            {
                l_resive.Text += "Fehler im Speicher";
                fenster_Fehler();
            }//end of if F0 != 0 also kein Fehler
            

sendbuf[] ist das Byte Arrey zum Senden, alles OK das Prog. sendet das was es senden soll.

readbuf[] hier wird hinein gelesen. In allen anderen Funktionen dieses Prog. wird dieser nicht bearbeitet, lediglich aubgefragt.

Vielen Dank schon mal

07.02.2008 - 15:52 Uhr

Hallo zusammen.

Ich schreibe gerade an einer Softwaretastatur, die auf einem Controlpanel mit Win CE laufen soll.
Das Problem besteht darin, Dass ich erstens kein SendKeys() verwenden kann, da das .NET Compact framework das nicht mit liefert, Außerdem verliert die Anwendung in die ich schreiben will den Fokus, wenn ich die Tastatur im vordergrund geöffnet habe.
Die Standard Win CE Tastatur zu nutzen wäre auch eine Möglichkeit, jedoch habe ich nach langem Googlen aufgegeben, da ich den Win CE befehl zum öffnen der Tastatur nicht finden konnte vgl. Win XP osk.exe ich brauche jedoch min. den Dateinamen, da ich diese Tastatur aus meiner bestehenden Anwendung aus öffnen muss. Dies ist erforderlich, da diese ähnlich wie eine PPT- Presentation ohne Taskleiste läuft. Der User soll nicht frei über das Win CE verfügen, sondern nur in dem Rahmen den ich ihm vorgebe.
Wäre die einfachere Lösung, weil weniger arbeit für mich, wenn ihr jedoch zur programmiertechnischen Lösung beitragen könntet, wäre ich auch sehr dankbar. Die Tastatur läuft soweit, dass ich eingaben machen kann und diese im gleichen Fenster in einer Textbox augeben kann.

Danke schonmal
der Daniel

System Win CE
IDE MS Visual Studio 2005