Byte oder String, was ist schneller

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Byte oder String, was ist schneller

      Hallo,

      um den Portc und Portd einzuschalten, verwende ich

      BASCOM-Quellcode

      1. $regfile = "m32def.dat" ' specify the used micro
      2. $crystal = 16000000 ' used crystal frequency
      3. $baud = 19200 ' use baud rate
      4. $hwstack = 128 ' default use 32 for the hardware stack
      5. $swstack = 128 ' default use 10 for the SW stack
      6. $framesize = 128 ' default use 40 for the frame space
      7. $lib "datetime.lbx"
      8. Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 0
      9. Spiinit
      10. Enable Interrupts
      11. W5500_nreset Alias Portd.7
      12. Config Pind.7 = Output
      13. Reset W5500_nreset
      14. Waitms 5
      15. Set W5500_nreset
      16. Waitms 500
      17. Config Tcpip = Noint , Mac = 0.8.&Hdc.77.05.11 , Ip = 192.168.178.29 , Submask = 255.255.255.0 , Gateway = 192.168.178.1 , Localport = 2005 , Chip = W5500 , Spi = 1 , Cs = Portb.4
      18. Config Portd = Output
      19. Config Portc = Output 'Für alle Ausgänge, in dem Fall sind es die LED's
      20. Do
      21. Start Watchdog
      22. For Idx = 0 To 3
      23. Result = Socketstat(idx , 0) ' get status
      24. Select Case Result
      25. Case Sock_established
      26. Ss = "Firstconnect|Laufschrift ist verbunden mit |" + Str(deviceadresse) + "|" + Channel1 + "|" + Channel2 + "|" + Channel3 + "|" + Channel4 + "|" + Channel5 + "|" + Channel6 + "|" + Channel7 + "|" + Channel8 + "|" + Str(timeout_ausgeloest)
      27. '+ "|{013}{010}"
      28. If Flags.idx = 0 Then
      29. Flags.idx = 1
      30. Result = Tcpwritestr(idx , Ss , 255 )
      31. End If
      32. Result = Socketstat(idx , Sel_recv) ' get number of bytes waiting
      33. If Result > 0 Then
      34. Do
      35. Result = Tcpread(idx , S)
      36. Tmp = Split(s , Command_array(1) , "|")
      37. Select Case Command_array(2)
      38. Case "1"
      39. Portc = Val(command_array(3)) '<-- in der Array3 steht die Binärzahl für die Ausgänge von (0-255)
      40. Portd = Val(command_array(4)) '<-- in der Array4 steht die Binärzahl für die Ausgänge von (0-255)
      41. Case Else
      42. End Select
      43. Reset Watchdog
      44. Loop Until S = ""
      45. End If
      46. Case Sock_close_wait
      47. Closesocket Idx
      48. Case Sock_closed
      49. Bclient = Getsocket(idx , Sock_stream , 2005 , 0) ' get socket for server mode, specify port 5000
      50. Socketlisten Idx
      51. Flags.idx = 0
      52. Case Sock_listen
      53. Case Else
      54. End Select
      55. Next
      56. Reset Watchdog
      57. Loop
      Alles anzeigen


      Frage ist, kann es sein, das Val von Bascom die Beschleunigung reduziert?
      Denn, ich gebe in den Array3 und in Array4 die Zahlen 0 und 255 abwechselnd in 100ms Takt und der AVR kommt nicht mit der Geschwindigkeit hinterher.

      Was sagt ihr dazu?

      danke im Voraus
      Katip
    • katipefendi schrieb:

      Was sagt ihr dazu?
      Also ich bin der Meinung das es etwas schneller geht die Bytes direkt zu übertragen, da ein String ja zwei mal gewandelt werden muss
      Sender - String in Byte
      Empfänger - Byte in String

      Jetzt wäre mal interessant wie/was du senden willst, reinen Text oder nur die Spalten- / Zeileninformationen für deine Matrixanzeige?
      Du kannst ja in deinem Windowsprogramm auch schon die Buchstaben in Teile zerlegen und dann an die Anzeige senden.
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Hi djmsc,

      das Problem ist aber auch, das ich mit der VB Programm String Kette senden, damit ich das dann in AVR trennen kann per SPLIT

      VB Programm:

      Quellcode

      1. clsTcp.Send("0" & "|" & "1" & "|" & CStr(SendeByte1) & "|" & CStr(SendeByte2) & "|" & CStr(SendeByte3) & "|" & CStr(SendeByte4) & "|" & _
      2. CStr(SendeByte5) & "|" & CStr(SendeByte6) & "|" & CStr(SendeByte7) & "|" & CStr(SendeByte8) & "|" & CStr(1) & "|" & CStr(2) & "|" & CStr(0) & "|" & _
      3. CStr(0) & vbCrLf)
      selbst verständlich kann ich das auch in Byte senden, aber wie kan ich dann das ganze im AVR trennen?

      VG
    • Hi,
      du kannst das ja in String senden vom PC Programm aus. Sind ja eh nur Bytes die ankommen.
      Dann ließt du es per byte aus und legst nur das Overlay drauf.

      BASCOM-Quellcode

      1. Dim Rf12_data(113) As Byte
      2. Dim Rf12_s As String * 112 At Rf12_data Overlay

      Genauso machst du es andersherum.
      Bastel dein String zusammen und das overlay Byte sendest du.


      BASCOM-Quellcode

      1. Dim Rf12_s As String * 112
      2. Dim Rf12_data(113) As Byte At Rf12_s Overlay
      Gruß Holger
      link zu mir..
      forum.auto-steuerung.de
      ___
    • Vermutlich braucht das Split sehr lange. Wenn es immer nur einzelne Bytes sind und die nicht im Klartext sein müssen würde die binäre Übertragung den Avr sehr entlasten. Das Val würde dann auch entfallen. Einfach die benötigte Variable auf den richtigen Ovelay-platz Dim'en und direckt verwenden:
      Dim NützlicherName as Byte at S+9 Overlay

      Portc = NützlicherName

      PS S muß vorher ge Dim't sein
    • Hallo,

      da CHR(0) in der Regel ein Zeichen für Stringende ist, lässt sich das wohl schwer binär per TCP/IP übertragen.
      Bei Overlay muss die Länge passen. Also bei Null dann 000 senden. Oder direkt "binärartig" senden "00000000", da dann die Bits einzeln zuweisen. Ob das am Ende wirklich schneller ist als den Umweg über VAL???

      Warum ist es so zeitkritisch? Der Flaschenhals ist dann der TCP/IP Protokoll Overhead. Evtl. statt des W5500 einen ESP nehmen. Der ist recht fix und kann dann mit dem AVR wieder binär sprechen und auch Nullen direkt übertragen.