Forum: PC-Programmierung Serielle Schnittstelle zwischen Rechner


von ruffy d. monkey (Gast)


Lesenswert?

Hallo ich möchte einzelne Zeichen aus einer binärdatei lesen und an eine
serielle schnittstelle übergeben (Übertragungsmedium ZigBee als Wireless 
Uart) jedoch habe ich das Problem das es nicht funktioniert wie ich es 
will:

ich bin jetzt soweit dass ich die bin dateien RICHTIG einlese.

using (FileStream fs = File.OpenRead(path))
            {
                Int64 f = fs.Length;
                byte[] b = new byte[f];
                UTF8Encoding temp = new UTF8Encoding(true);
                while (fs.Read(b, 0, b.Length) > 0)
                {
                    string s = ByteArrayToString(b);
                    textBox1.AppendText(s);
                    serialPort1.Write(b, 0, b.Length);
                }

In b steht genau das was ich möchte....

Das Problem ist leider auf der Empfängerseite...

private void serialPort1_DataReceived
            (object sender, System.IO.Ports.SerialDataReceivedEventArgs
e)
          {
              RxString = serialPort1.ReadExisting();
              int y = serialPort1.BytesToRead;
              serialPort1.Read(buff, 0, 96966);
              this.Invoke(new EventHandler(DisplayText));
          }

Es werden jedoch nur 392(y=0x188) übertragen :-( und das irgendwo in dem
File -> also nicht schön von anfang an). Als Übertragungsmedium habe ich
ZigBee Module die als Wireless Uart laufen. Was mache ich hier falsch?

: Gesperrt durch User
von Karl H. (kbuchegg)


Lesenswert?

ruffy d. monkey schrieb:

> private void serialPort1_DataReceived
>             (object sender, System.IO.Ports.SerialDataReceivedEventArgs
> e)
>           {
>               RxString = serialPort1.ReadExisting();
>               int y = serialPort1.BytesToRead;
>               serialPort1.Read(buff, 0, 96966);
>               this.Invoke(new EventHandler(DisplayText));
>           }
>
> Es werden jedoch nur 392(y=0x188) übertragen :-( und das irgendwo in dem
> File -> also nicht schön von anfang an). Als Übertragungsmedium habe ich
> ZigBee Module die als Wireless Uart laufen. Was mache ich hier falsch?

Der DataReceived Event wird vom System angeleiert, sobald auf der 
Seriellen die ersten Zeichen eintrudeln. Logisch, das da in einem Aufruf 
nicht alles empfangen wird ... der Sender hat noch gar nicht begonnen 
die Daten wegzuschicken.

Du wirst mehrere Aufrufe von DataReceived sehen und du musst die Daten 
ALLER Aufrufe wieder zu deinen kompletten Daten zusammensetzen.

Daher wäre es eine extrem gute Idee, wenn der Sender erst mal eine 
Information rausrücken würde, wieviele Daten er denn eigentlich zu 
senden gedenkt oder sonst irgendwie dem Empfänger eine Möglichkeit gibt, 
zu erkennen "jetzt kommt nichts mehr".

Was du letzten Endes von deinem Rechner erwartest ist, dass er hellsehen 
kann. Er soll sich irgendwie aus den Fingern saugen, wieviele Datenbytes 
da eintrudeln werden und wenn alle da sind, soll er dir mit dem 
DataReceived Event Bescheid geben. Nur ... so spielts das nicht. Auf der 
Seriellen bist du selbst für das Protokoll verantwortlich.

von Peter II (Gast)


Lesenswert?


von Karl H. (kbuchegg)


Lesenswert?

@Peter
Danke

@TO
Na super!
Das ist genau das, womit wir eine Riesenfreude haben: dieselbe Frage vom 
gleichen Autor in 2 verschiedenen Threads.

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.