PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Array mit Inputbin befüllen



demmy
10.03.2012, 21:06
Hallo zusammen,

ich habe folgendes Problem. Ich möchte 14 Byte aus dem Eingangspuffer der seriellen Schnittstelle in eine 14 Byte großes Array schreiben.
Ich habe es folgendermaßen versucht.



Dim A as Byte
Dim Bytearray(14) as Byte

For A = 1 to 14
Inputbin Bytearray(A)
Next


Allerdings funktioniert das leider überhaupt nicht. Der µC bleibt immer an dieser Stelle hängen. Kann mir jemand sagen warum? Und ob es noch eine andere Möglichkeit gibt die Bytes auszulesen?

Wenn ich die Bytes alle einzeln per Inputbin auslese funktioniert es ja auch!?

Danke für euere Hilfe.

crissa
10.03.2012, 21:29
Hoi,
in den meisten Programmiersprachen fängt ein Array mit dem Element 0 an. Du hast also ein Array mit 14 Elementen angelegt in dem Du die einzelnen Elemente mit 0 bis 13 ansprechen kannst.

Lösung A: Mach das Array 15 Elemente groß
Lösung B: Zähle von 0 bis 13

Ich gebe hiermit zu das ich die verwendete Programmiersprache nicht kenne. Es würde mich aber wundern wenn es hier anders ist. Deswegen würde ich mich über eine Rückmeldung freuen. Gegen meine Vermutung spricht übrigens das es bei "einzeln per Inputbin auslese" klappt.
Tschö, Tore

crissa
10.03.2012, 21:41
Hoi,
das Problem ist wohl nicht das Array sondern der Befehl "Inputbin":

---------
The number of bytes to read depends on the variable you use.
When you use a byte variable, 1 character is read from the serial port.
An integer will wait for 2 characters and an array will wait until the whole array is filled.
---------

Siehe <INPUTBIN (http://avrhelp.mcselec.com/index.html?inputbin.htm)>.

Ich lass meine erste (und wohl falsche) Vermutung einfach mal stehen.
Tschö, Tore

for_ro
10.03.2012, 22:07
Hallo demmy,
bist du denn sicher, dass 14 Byte gesendet werden?
Wenn ja, dann müsste der Befehl
Inputbin Bytearray(1)
reichen. Wie sieht denn der Rest des Programms aus? Wenn du vom Eingangspuffer sprichst, hast du dann über Config SerialIn einen Buffer angegeben?
Wenn du etwas mehr Kontrolle über den Einlesevorgang haben möchtest, kannst du es auch so machen:

Enable URXC
Enable Interrupts
On URXC Byte_received_ISR
...
Do
...
If Bytes_complete_flag = 1 Then
...
Endif
...
Loop
End

Byte_received_ISR:
incr byte_count
Byte_array(Byte_count) = UDR
If Byte_count = 14 Then Bytes_complete_flag = 1
Return


Hoi,
in den meisten Programmiersprachen fängt ein Array mit dem Element 0 an.
...
Deswegen würde ich mich über eine Rückmeldung freuen.
Kann man in Bascom konfigurieren. Wenn Config Base = 0 gesetzt ist, verhält es sich so, wie du geschrieben hast. Ansonsten läuft der Index von 1 bis 14.

crissa
11.03.2012, 07:43
Kann man in Bascom konfigurieren. Wenn Config Base = 0 gesetzt ist, verhält es sich so, wie du geschrieben hast. Ansonsten läuft der Index von 1 bis 14.

Hoi,
Danke für die Erklärung.
Tschö, Tore

demmy
11.03.2012, 21:14
Hallo zusammen,

ich habe nach langer Suche folgende Lösung gefunden:

Inputbin array(1) , 14

Und zwar ist das der Befehl um das Array direkt zu befüllen, es werden 14 Byte aus dem empfangspuffer in das "array" geschrieben ab Index Nr. 1

Ich hab es getestet und es funktioniert! Das ist wohl der einfachste Weg ein Array direkt aus dem Empfangspuffer zu füllen.

Für das senden gillt das selbe:

printbin array(2) , 13 ;

Das würde 13 Byte aus dem "array" ab indexnr. 2 senden.

Gruß