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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren