Z jakiegoś źródła otrzymujesz do niego dane o różnej długości a teraz zależy Ci żeby wysłać tylko tyle ile otrzymałeś.
Polecenie Printbin przyjmuje jako argument ilości do wysyłki tylko stałe
Trzeba więc napisać Printbin Array(1) co wyśle całą tablicę, albo wpisać Printbin Array(1),Stała
Printbin Array(1), Zmienna ODPADA!
Można oczywiście poradzić sobie budując taką niewygodną i wolną konstrukcję:
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- Dim Array(250) As Byte, N As Byte, Helpb As Byte, Zmienna As Byte
- For N = 1 To Zmienna
- Helpb = Array(n)
- Printbin Helpb
- Next

Po podejrzeniu jak Bascom wykonuje Printbin widać że ilość bajtów do wysłania ładuje do R19
Na aktualny adres komórki do wysłania wskazuje X
Kiedy wartość spod X jest odczytywana to automatycznie adres się zwiększa o jeden (X+)
Potem uC sprawdza czy rejestr wysyłkowy USART jest wolny (lub czy poprzedni bajt już wysłano)
Jeśli nie to wraca z powrotem w miejsce gdzie znów sprawdza czy rejestr jest już wolny.
Kiedy uda się wstawić bajt do rejestru to odejmuje jeden od liczby bajtów do wysłania.
Jeśli stwierdza że trzeba wysłać kolejny to wraca na początek po nowy bajt z kolejnej komórki na którą wskazuje X

Tak wiec napisałem sobie SUB który na początku ładuje do X pierwszą pozycję mojego bufora.
Do R19 ładuję ilość danych do wysyłki i ...gotowe

Poniżej przykład dla symulatora. Z 10 bajtów o wartościach ASCI 1,2,3.. wyśle tylko 6 a nie 10

Code: [Zaznacz cały] [Rozwiń/Zwiń]
- $regfile = "m2560def.dat"
- $crystal = 16000000
- $hwstack = 64
- $swstack = 64
- $framesize = 255
- $baud = 9600
- $baud1 = 9600
- $sim
- Config Submode = New
- Open "COM2:" For Binary As #2
- Dim Array(10) As Byte , Helpb As Byte , N As Byte , Chrs_to_send As Byte
- 'załaduj "cyferkami" 123456789
- For N = 49 To 57
- Incr Helpb
- Array(helpb) = N
- Next
- Sub Print_bin
- R19 = Chrs_to_send 'załaduj liczbę bajtów do wysłania
- Loadadr Array(1) , X 'ustaw pointer na pierwszy bajt tablicy
- Start_point:
- !LD R24, X+ 'do R24 załaduj bajt na który wskazuje pointer i zwiększ adres+
- Wait_for_empty:
- !LDS R0, UCSR1A 'odczytaj rejestr kontrolujacy USART
- !SBRS R0, UDRE1 'sprawdź czy bit "rejestr gotowy na nowe dane" jest ustawiony
- !RJMP Wait_for_empty
- !STS UDR1, R24 'wstaw dane z R24 do rejestru USART
- !DEC R19 'zmniejsz liczbę bajtów do wysyłki
- !BRBC 1,Start_point 'jeśli to nie koniec (R19<>0) to wróć na początek
- End Sub
- Chrs_to_send = 6
- Call Print_bin
- End