Łap. Działa jak złoto. Możesz go zawalić danymi R20B50R80R81G100 itd. Program jest napisany jak na Modbusa.
Działa tak. W stanie spoczynku czeka na jakąś literkę. Jeśli to będzie R to zapamięta że zbieramy cyferki do R, analogicznie do innych kolorów.
Teraz ciekawostka. Jeśli czekamy na drugą lub trzecią cyfrę do jakiejś literki a tu nagle nowa literka to znaczy że już następnych do tej poprzedniej nie będzie. To znak że trzeba najpierw przetworzyć te nazbierane. Jeśli to było B22 a teraz przyszło dalej B22R to programik najpierw przetworzy Bxx a zapamięta że teraz zbieramy R
Jeśli w którymkolwiek momencie mamy już cztery znaki to przetwarzamy bo więcej string mieć nie powinien (max255 i literka).
Teraz część z Modbusa. Może się zdarzyć, że wyślesz tylko dwa lub trzy znaki. Wtedy program odczeka cztery znaki od ostatniego otrzymanego i i tak przetworzy odebraną ramkę
Piszesz trochę niejasno i już nie wiedziałem czy mamy wolny Timer2 czy nie.
Niemniej na obrazku widać jak pięknie się wszystko zbiera. Program printuje nowe wartości TYLKO jeśli się różnią od poprzednich.
$regfile = "m328pdef.dat"
$crystal = 16000000
$hwstack = 64
$swstack = 16
$framesize = 64
$baud = 9600
Debug On
Config Submode = New
Const _valcheck = 1 'sprawdzanie czy dla instrukcji Val podaliśmy tylko cyfry
Config Serialin0 = Buffered , Size = 20
'@9600 baud, (1/9600)*8=1/1200 Hz = 0.83 ms
'poczekamy cztery znaki = 3,25ms
Config Timer2 = Timer , Prescale = 256 , Clear_timer = 1
Compare2a = 199
On Compare2a Timer2_isr '3,2ms @16MHz/256
Stop Timer2
Dim Char As String * 1 , Command As String * 4
Dim Pwm_val(3) As Byte , Helpb As Byte , Rx_started As Byte
Dim Val_nr As Byte , Str_val As String * 3 , Temp_nr As Byte
Dim R_val As Byte , G_val As Byte , B_val As Byte
Enable Compare2a
Enable Interrupts
Do
If 0 < Ischarwaiting() Then
Char = Inkey()
Stop Timer2
Timer2 = 0
Select Case Char
Case "R" : Temp_nr = 1
Case "G" : Temp_nr = 2
Case "B" : Temp_nr = 3
Case Else
Temp_nr = 0
End Select
If Temp_nr > 0 Then 'jeśli znaleziono literkę
If Rx_started = 0 Then 'dopiero zaczynamy zbierać znaki
Rx_started = 1 'flaga
Command = Char 'to dopiero początek stringa
Val_nr = Temp_nr 'zapamiętaj czy zbieramy R,G, czy B
'Start Timer2 'uruchom Timer
Else 'zbieraliśmy znaki a tu nowa literka
'nie dodajemy literki
Str_val = Mid(command , 2) 'odcinamy literkę z lewej
Helpb = Val(str_val)
If Err = 0 Then Pwm_val(val_nr) = Helpb 'testujemy wartość
Command = Char 'zbieramy od nowa (nowa literka z przodu)
Val_nr = Temp_nr
'Start Timer2
End If
Else 'nie było literki więc to cyfra
Command = Command + Char
If Len(command) > 3 Then 'jeśli mamy już cztery znaki R255 lub G155
Str_val = Mid(command , 2) 'odcinamy literkę z lewej
Helpb = Val(str_val)
If Err = 0 Then Pwm_val(val_nr) = Helpb 'testujemy wartość
Command = ""
Rx_started = 0
End If
'jeśli literka
End If
'if Ischarwaiting()
End If
'tu na potrzeby Debug
If R_val <> Pwm_val(1) Then
R_val = Pwm_val(1)
Print "Nowe R_val=" ; R_val
End If
If G_val <> Pwm_val(2) Then
G_val = Pwm_val(2)
Print "Nowe G_val=" ; G_val
End If
If B_val <> Pwm_val(3) Then
B_val = Pwm_val(3)
Print "Nowe B_val=" ; B_val
End If
If Rx_started = 1 Then Start Timer2
Loop
End
Timer2_isr:
Stop Timer2
Timer2 = 0
Str_val = Mid(command , 2) 'odcinamy literkę z lewej
Helpb = Val(str_val)
If Err = 0 Then Pwm_val(val_nr) = Helpb 'testujemy wartość
Command = ""
Rx_started = 0
Return
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.