- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 6 von 6

Thema: Intputbin - ein paar Fragen...

  1. #1
    Erfahrener Benutzer Roboter Genie Avatar von Willa
    Registriert seit
    26.10.2006
    Ort
    Bremen
    Alter
    43
    Beiträge
    1.273

    Intputbin - ein paar Fragen...

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo!
    Ich möchte von einem Gerät (µC oder PC) Daten zu einem Mega32 übertragen. Das ganze muss so schnell wie möglich und für den Empfänger so ressourcenschonend wie möglich geschehen.
    Übertragen möchte ich folgende Bytes:
    Motor1Soll Motor2Soll Motor3Soll Checksumme

    Die Checksumme wäre z.B. einfach Motor1Soll+Motor2Soll+Motor3Soll, oder?
    Was aber wenn die Checksumme durch die Addition größer als 255 wird...?

    Ich habe noch mehr Verständnisprobleme:
    Wenn ich im µC die Daten so abfrage:

    dim Message(4) as Byte
    If Ischarwaiting() > 0 Then
    Inputbin Message(1) , 4
    End If

    dann werden immer 4 Bytes eingelesen. Falls aber irgendwann mal eins verschluckt wurde, dann bleibt das ganze dauerhaft verschoben, richtig?
    Und wenn zufällig mal 2 Bytes gesendet werden und danach gar nichts mehr, dann wartet der Empfänger ewig bis die fehlenden 2 Bytes nachgereicht werden.

    Wie löst man diese Probleme programmiertechnisch...? Da steht grad jemand ziemlich auf meiner Leitung...
    Viele Grüße, William
    -> http://william.thielicke.org/

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113

    Re: Intputbin - ein paar Fragen...

    Zitat Zitat von Willa
    Hallo!
    Was aber wenn die Checksumme durch die Addition größer als 255 wird...?
    Macht nichts, das passiert beim Empfangen ja auch. Also einfach den Byte-Wert übertragen.

    Zitat Zitat von Willa
    Ich habe noch mehr Verständnisprobleme:
    Wenn ich im µC die Daten so abfrage:

    dim Message(4) as Byte
    If Ischarwaiting() > 0 Then
    Inputbin Message(1) , 4
    End If
    Ich mach's immer so:
    While Ischarwaiting() > 0
    var=inkey()
    Wend

    Wenn nichts mehr vorliegt, fliegt er aus der Schleife raus.

    Gruß

    Rolf

  3. #3
    Erfahrener Benutzer Roboter Genie Avatar von Willa
    Registriert seit
    26.10.2006
    Ort
    Bremen
    Alter
    43
    Beiträge
    1.273
    Hi!
    Damit kann ich dann aber auch erstmal nur ein byte einlesen. Natürlich könnte ich alles in nem String verpacken, aber ich dachte einzelne Bytes gehen schneller zu übertragen. Einen String muss ich ja auch erst wieder aufteilen und dann die einzelne Teile wieder in Bytes umwandeln...
    Irgendwie komme ich nicht weiter, mein Gehirn läuft aber heute auch maximal auf Standgas...
    Das hier möchte ich, bekomme es aber nicht hin:

    Wenn ein Byte empfangen wurde dass der Startcodierung entspricht (z.B.255),
    dann die folgenden drei Bytes in ein ByteArray einlesen,
    das Checksum Byte einlesen,
    aus dem ByteArray die Checksum berechnen,
    empfangene Checksum mit berechneter vergleichen.
    Wenn beide identisch sind, dann
    Motor1=ByteArray(1)
    Motor2=ByteArray(2)
    Motor3=ByteArray(3)
    Durchlauf fertig.
    Viele Grüße, William
    -> http://william.thielicke.org/

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Ich dachte, das wäre klar:

    index=1
    While Ischarwaiting() > 0
    var(index)=inkey()
    incr index
    Wend

  5. #5
    Erfahrener Benutzer Roboter Genie Avatar von Willa
    Registriert seit
    26.10.2006
    Ort
    Bremen
    Alter
    43
    Beiträge
    1.273
    Das habe ich mir schon so gedacht. Allerdings habe ich halt Probleme damit eine Startcodierung zu verwursten. Sonst verschiebt sich ja irgendwann mal der Index... Ach Mensch, wieso ist das heute so kompliziert....
    Viele Grüße, William
    -> http://william.thielicke.org/

  6. #6
    Erfahrener Benutzer Roboter Genie Avatar von Willa
    Registriert seit
    26.10.2006
    Ort
    Bremen
    Alter
    43
    Beiträge
    1.273
    Ich habe jetzt eine sehr einfache und zufriedenstellende Lösung gefunden die sehr schnell läuft. Erst wird ein Byte mit der Adresse empfangen. Diese ist entweder 253, 254 oder 255. Danach wird das Byte zur Motorsteuerung übertragen (dieses Byte wird immer zwischen 0 und 252 liegen). Ich glaube ich werde auch ohne Checksum keine Probleme mit Übertragungsfehlern bekommen. Wenn ich mit 200Hz Daten übertrage läuft mein µC statt mit 357 Hz noch mit 320 Hz. Das ist gut genug, da ich wohl nur mit max 10Hz Daten übertragen werde.
    Wenn ich die Baud Rate auf 115200 erhöhe sind es sogar nur 12 Hz Unterschied.

    Code:
    $regfile = "m32def.dat"
    $framesize = 64
    $swstack = 64                                   
    $hwstack = 64                                     
    $crystal = 16000000
    $baud = 38400
    Config Serialin = Buffered , Size = 20
    Enable Interrupts
    
    Dim Recipient As Byte
    Dim Message1 As Byte
    Dim Message2 As Byte
    Dim Message3 As Byte
    Const Address1 = 253
    Const Address2 = 254
    Const Address3 = 255
    
    Do
    If Ischarwaiting() > 0 Then
      If Recipient <> Address1 And Recipient <> Address2 And Recipient <> Address3 Then
         Inputbin Recipient
      End If
    End If
    
    If Recipient = Address1 Then
      If Ischarwaiting() > 0 Then
        Inputbin Message1
        Print Recipient ; " " ; Message1
        Recipient = 0
      End If
    End If
    
    If Recipient = Address2 Then
      If Ischarwaiting() > 0 Then
        Inputbin Message2
        print recipient;" ";message2
        Recipient = 0
      End If
    End If
    
    If Recipient = Address3 Then
      If Ischarwaiting() > 0 Then
         Inputbin Message3
         Print Recipient ; " " ; Message3
        Recipient = 0
      End If
    End If
    Loop
    Viele Grüße, William
    -> http://william.thielicke.org/

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress