German Serial / Async Streams empfängt nur mit LF/CR

kollimann

Member
Licensed User
Longtime User
Hallo, ich nutze Async Streams zum senden und epmpfangen von Daten.
Meine Gegenstelle sendet leider kein CR bzw LF am Ende des Datenpaketes, daher empfange ich auf meinem Androit Gerät keine Daten.
Kann man das irgendwie ändern?
Danke Heiko
 

harryup

Member
Licensed User
Hi Heiko,
auch ohne CRLF sollte der Empfang möglich sein, vielmehr ist es so, dass die UartISR bei empfangenen Bytes mehrfach ausgelöst wird und der empangene String zusammengesetzt werden muss, damit die komplette Message als String zur Verfügung steht.
Wenn kein Message-ENDE-Zeichen definiert ist, wird die Astream-ISR wieder und wieder ausgelöst, dein Empangsstring wächst bis in alle Unendlichkeit oder du verarbeitest jedes einzelne Fragment der Message.
Dabei spielt es keine Rolle, ob mit USBserial oder mit felUSB gearbeitet wird, beide verhalten sich gleich, was den Empfang angeht.
Nachfolgend mal ein Codeschnipsel:

Sub Process_Globals
Dim usb As UsbSerial
Dim astreams As AsyncStreams
Dim Uart_in_ready As Boolean = False
Dim Pakete as Int = 0
Dim Xstr As String = ""
Dim Text_in As String = ""
End Sub

dazwischen wird die USB Permission abgefragt, astreams inizialisiert usw., alles wie im USBSerial Beispiel

Sub Astreams_NewData (Buffer() As Byte)
Pakete = Pakete + 1 ' einzelne Fragmente der Message zählen (ich empfange ca. 50 Bytes, das sind 3 bis 5 Pakete)
Xstr = Xstr & BytesToString(Buffer, 0, Buffer.Length, "UTF-8") ' Bytes im Puffer zu XSTR hinzufügen
If Xstr.EndsWith(CRLF) = True Then ' Message ist fertig nach Empfang von CRLF, kann auch ein beliebiges anderes Zeichen sein
Text_in = Xstr ' komplette Message nach Text_in kopieren
Xstr = "" ' Xstr wieder leeren
Uart_in_ready = True ' Message komplett Flag setzen
Label1.Text = Text_in & " Pakete: " & Pakete ' Message anzeigen, nicht elegant in einer ISR-Sub, aber für Kontrolle ok
End If
End Sub
 

harryup

Member
Licensed User
Nachtrag: Ist ja hart, beim Reply werden alle Leerzeichen für Einrücken und Kommentare gelöscht, sieht ja katastrophal 'übersichtlich' aus
 

kollimann

Member
Licensed User
Longtime User
Hm, OK bissel versteh ich.....
Umschreiben? ich bekomme ein "$" als Endzeichen.......

Danke
 

kollimann

Member
Licensed User
Longtime User
OK Verwirrung, ich bin/war verwirrt.
Ich nutze AsyncStreams Text, das ist in meiner alten B4A Version nicht integriert sondern einzeln eingebunden.
Bei mir ist das so

Private Sub astreams_NewData (Buffer() As Byte)
Dim newDataStart As Int = sb.Length
sb.Append(BytesToString(Buffer, 0, Buffer.Length, charset))
Dim s As String = sb.ToString
Dim start As Int = 0
For i = newDataStart To s.Length - 1
Dim c As Char = s.CharAt(i)
If i = 0 AND c = Chr(10) Then '\n...
start = 1 'might be a broken end of line character
Continue
End If
If c = Chr(10) Then '\n
CallSubDelayed2(mTarget, mEventName & "_NewText", s.SubString2(start, i))
start = i + 1
Else If c = Chr(13) Then '\r
CallSubDelayed2(mTarget, mEventName & "_NewText", s.SubString2(start, i))
If i < s.Length - 1 AND s.CharAt(i + 1) = Chr(10) Then '\r\n
i = i + 1
End If
start = i + 1
End If
Next
If start > 0 Then sb.Remove(0, start)
End Sub


das müsste man so ändern das es nur auf "$" als Endzeichen reagiert, damit wäre doch alles Gut?

Danke
 

harryup

Member
Licensed User
sollte. Musst halt ausprobieren. Ist aber ein Haufen 'Holz' drinne, in der Empfangs-ISR, braucht's das wirklich alles?
Ich meine, dein Puffer (Buffer) enthält ja beim Auslösen des Interrupts n Zeichen, mindestens aber eines, sonst würde er nicht auslösen.
Funktioniert in der alten Version die Funktion: BytesToString(Buffer, 0, Buffer.Length, "UTF-8") nicht?
Die transferiert ja ein oder eben mehrere Bytes (den kompletten Buffer-Inhalt) zu einem String, bestehend aus 1 - n Zeichen.
Dann nur mit EndsWith("$") abfragen und die Message ist fertig, wenn True.
ISRs sind ein wenig empfindlich, sollten so schlank wie möglich gehalten werden, im Idealfall nur ein Flag setzen und gut.
Aber in B4A respektive Java ist das alles bissl anders, ich käme gerne an den Bufferinhalt ohne ausschließlich in der ISR, wenn jemand eine Idee dazu hat?
Grüssens, harry
 

DonManfred

Expert
Licensed User
Longtime User
htrag: Ist ja hart, beim Reply werden alle Leerzeichen für Einrücken und Kommentare gelöscht, sieht ja katastrophal 'übersichtlich' aus
Benutz die richige funktion um code einzufügen, dann klappt das auch!

codetag001.png

codetag002.png

codetag003.png
 
Top