Hilfe beim Einlesen des Com Ports C#

OP #4247849
Lesenswert?
• ▲
▼
Servus,

ich scheitere gerade beim Einlesen einer COM-Schnittstelle.

Die Schnittstelle sollte richtig konfiguriert sein.
Methoden wie "port.readline" und "port.readexisting" funktioniern hier 
auch nicht zu 100%

Ich möchte mit der Software ein Bluetooth Modul steuern.
Über Terminal Software wie Tera Term und Cool Term funktioniert dies 
wunderbar, doch es ist nicht Sinn und Zweck das ganze von einem Terminal 
aus zu Steuern.
Auf den Port zu schreiben funktioniert, und der Chip gehorcht auch den 
Befehlen.
Scheitert aber beim Einlesen der sichtbaren Devices.
Die genaue Länge des Bytestreams ist unklar und ein Absatz wird auch 
keiner empfangen.

Ich habe den Auschnitt des Cods mal angehängt.

Der Chip ist ein WT32I mit der neuesten IWRAP Firmware

Freue mich auf eine Antwort!
Angehängte Dateien:
#4247871
Lesenswert?
• ▲
▼
So spontan würde ich sagen, dass du viel zu viel liest:
1
char[] macadress = new char[port.BytesToRead];
2

3
for (int i = 0; i < macadress.Length;i++ )
4
            {
5
                port.Read(macadress, i, port.BytesToRead);
6
                    
7
            }

Die Schleife kannst du dir sparen:
1
char[] macadress = new char[port.BytesToRead];
2
port.Read(macadress, 0, port.BytesToRead);

Und vorsicht: BytesToRead kann auch 0 sein!
Gast #4247897
Lesenswert?
• ▲
▼
Ich würde eher sagen das es zu schnell geht.

Du sendest einen Datenpacket richtung Bluetooth modul und erwartest das 
das Modul innerhalb weniger Taktzüglen deines Programmes eine antwort 
erhält.

Versuche es mal üwie folgt an zugehen

- du initialisiert den serialPort im Konstruktor deines Forms
- beim Clicken auf einen Button sendest du mit der Write Methode der 
serial Port Klasse dein Datenpacket weg
- mit dem Event aus der Serial Port klasse
private void serialPort_DataReceived(object sender, 
SerialDataReceivedEventArgs e)

dort kannst du die empfangen daten dann verarbeiten
Gast #4248002
Lesenswert?
• ▲
▼
public int Read(char[] buffer, int offset, int count)

Generell solltest du beachten, dass Read nicht unbedingt 'count' Bytes 
zurückgibt, sondern maximal 'count' Bytes. Du darfst also den 
zurückgelieferten Wert nicht ignorieren.
Man kann nicht im Voraus wissen, wieviel bei einem Read gelesen wird 
(*). Wenn gar keine Daten zur Verfügung stehen, blockiert Read, bis 
mindestens 1 Byte gelesen werden kann oder bis zum Timeout; zwischen 
Timeout und 'count' Bytes ist also alles möglich. Im einfachsten Fall 
verwendest du eine Schleife, die erst verlassen wird, wenn insgesamt 
count Bytes gelesen wurden.

(*) Als ich vor kurzem ein Gerät per USB-Adapter ausgelesen habe, kam 
der kurze Datenblock manchmal in einem Stück, dann wieder in 4 Teilen an 
...

Ein paar Tipps:

http://blogs.msdn.com/b/bclteam/archive/2006/10/10/top-5-serialport-tips-_5b00_kim-hamilton_5d00_.aspx

http://www.sparxeng.com/blog/software/must-use-net-system-io-ports-serialport

Ich selbst würde es bei einem neuen Projekt wahrscheinlich mit dem 
BaseStream versuchen (und gegebenenfalls, bei .NET >= 4.5, mit 
ReadAsync).

BTW: Falsches Unterforum (-> PC-Programmierung)
OP #4248033
Lesenswert?
• ▲
▼
Hab jetzt eine Multiline Textbox erstellt.
Die empfangenen Daten sollen in der Textbox dargestellt werden.
Wenn ich auf dem Board einen Taster drücke wird ein String gesendet.

wenn ich jetzt im Datareceived handler bin will ich den empfangen Text 
sofort in die Textbox schreiben (wie ein Terminal)
1
 textbox1.appendtext(myserialport.readExisting());

aber das mag er nicht...
#4248050
Lesenswert?
• ▲
▼
private void serialPort1_DataReceived(object sender, 
System.IO.Ports.SerialDataReceivedEventArgs e)
        {

            try
            {
                if (InvokeRequired)
                {
                    Invoke(new MethodInvoker(DoSerialInput));
                }
            }
            catch
            {

            }
        }

 private void DoSerialInput()
        {
            string s = "";
            try
            {
                s = serialPort1.ReadLine();
            }
            catch
            {
                return;
            }
}


So habe ich das bei mir gelöst.
in s steht dann was Empfangen wurde und kann weiter verarbeitet werden.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.