Problem jest o tyle skomplikowany poniewaz tekst bedzie miał długość w porywach do 5 000 bajtów, a podobno na Uarcie występują zakłócenia.
Podczas rozmowy z userem Jdsul otrzymalem nastepujące informacje:
Jestem początkujący w uC i nie bardzo umiem to wszystko ogarnąć i scalić w kod ;/Cześć
Z RS-232 jest taka zabawa że czasem
możesz odebrać coś czego nie chcesz odebrać.
A to pojawi się jakaś szpilka lub zmiana stanu a to zamiast "2" nadanej "3".
Dobrze się przed tym zabezpieczyć.
Najlepszym sposobem jest albo praca z "sztywną ramką", tzn
Dajesz jakiś znak startu i jakiś znak stopu np.: $ to będzie znak startu,
^ to będzie znak końca i teraz możesz na sztywno ustalić ilość danych pomiędzy tymi znakami;
Przykład
Ranka ma znak startu i końca i 12 znaków w środku
$Ala_ma_kota.^
Teraz robisz dwie pętle pierwsza oczekuje na pojawienie się znaku '$'
Druga czyta znaki do jakiegoś bufora aż doczeka się znaku '^' bufor musi mieć swój licznik
który wzrasta o 1 po każdym odczycie znaku. Na koniec sprawdzasz czy licznik wynosi 12 jeśli tak to możesz traktować
dane jako poprawne i przepisać je do pamięci EEPROM bajt po bajcie. Jeśli liczba znaków jest mniejsza lub większa od 12 to masz
jakiś błąd transmisji i proponuję skasować buffor i dalej czekać na poprawny pakiet danych.
Oczywiście jest to najprostszy protokolik, możesz jeszcze dla pewności dodać procedurę liczenia sumy kontrolnej, lub wskaźnika parzystości bitów itd.
Metod analizy poprawności zawartości ramki jest mnóstwo poczytaj o CRCProblem jest tylko taki że wtedy to samo musisz policzyć na PC a na razie
będziemy się tylko bawić z terminalem więc lepiej zrób protokół ze stałą ramką.
while
Dim Odebrany, Licznik1, Licznik2 As Byte
Dim Odebr_znak As String * 12
while not Odebrany = '$' do ' Oczekiwanie na
begin
Input "Odbiór_danych" , Odebrany
loop
Licznik1 = 0;
while not {Odebrany='^'} do
Input "Odbiór_danych" , Odebrany
Licznik1 = Licznik1+1;
Odebr_znak[Licznik1] = Odebrany
LOOP
if (Licznik1 = 12) then
Adres_write = 1;
for licznik2 = 0 to 12 do
Begin
I2cstart 'Startzapisu.
I2cwbyte Adres_write 'Wyślij pod adres Adres_write.
I2cwbyte 1 'Zapisz pod numerem 1 (może być inny).
I2cwbyte Odebr_znak[Licznik2] 'Wyślij zawartość zmiennej Odebr_znak o indeksie Licznik2
I2cstop 'Zatrzymaj zapis.
Adres_write = Adres_write+1
end
else ' czyli ramka inna niż 12 znaków wtedy
exit ' wyskocz i wróć do procedury oczekiwania na znak '$'
end
' Czy jakoś tak
Posprawdzaj składnie, bo ja raczej w C piszę![]()
![]()
Acha dobrze byłoby jakość przemyśleć co ma uruchamiać procedurę czytania znaków z RS a co kończyć może jakiś
dodatkowy klawisz lub coś. Bo te pętle mogą czekać na znak latami![]()
:) przemyśl to
Darek.
proszę o pomoc
zamieszczam jeszcze schemat układu:
(sw1) włącza oczekiwanie na odbiór danych oraz włącza i wyłącza zasilanie max232)
[ Dodano: 2007-09-19, 21:17 ]
witam ponownie... czy na prawdę nikt nie jest w stanie mi pomóc ...? ten problem jest dla mnie priorytetowy ...