Witam
Dodam że szukałem na forum odpowiedzi na to pytanie ale nie znalazłem 100% pewnej informacji.
Otóż posiadam w atmedze cztery sprzętowe uarty i na jednym z nich ma pracować mój poprzedni już działający moduł(którego już nie mogę przeprogramować aby zmienić coś).
Transmisja wygląda tak:
Z modułu A (atmega32) wysyłam poleceniem :
Moduł B na otrzymaną wiadomość tworzy coś w stylu swojego własnego protokołu i wysyła mi wartości interesujących mnie zmiennych takim poleceniem:
o takiej treści:
Dodam że takie zapytanie i odpowiedź będzie wysyłane cyklicznie co 10-20sekund.
Teraz aby w module A który wysłał zapytanie (RED) odebrać ten długi tekst w przerwaniu pomyślałem że zrobię to tak:
Chciałem aby po odebraniu znaku końca (tzn. po wywołanym nim przerwaniu) wyciągnąć z bufora dane i przepisać do odpowiedniej zmiennej np . tak:
Niestety to nie zadziała bo w przesyłanym tekście może wielokrotnie wystąpić znak 13. Jedyne pewne znaki to te na początku czyli "AT1". Więc nic z tego nie będzie.
Pomyślałem żeby pozbyć się tego :
i zastąpić to tym:
i odbierać dane w taki sposób:
Co prawda to działa (kulawo ale działa) ale jeśli nastąpi szybkie wymienianie się informacji to nie da się zapanować nad odbieraniem w ww. przykład bo lubi zdublować odebrane dane i zamiast odebrać 156 znaków odbieram dwa razy tyle.
Chciałbym koniecznie odbierać dane w przerwaniu (w sumie wysyłać także bym chciał w ten sposób) , i zrobić to tak że jak przyjdą dane(kompletne czyli 156 znaków) to aby zostały przepisane do zmiennej (np. odebrane_dane -oczywiście string) i aby jakaś flaga (np. dane_czekaja = 1 ) informowała że dane czekają.
Dobrze aby można było odbierać i krótsze informacje np: "ABC" wysyłane z urządzenia B także w taki sposob:
Może niezbyt jasno to wszystko opisałem ale tak to wygląda. Wiem że już milion razy były podobne rzeczy na forum ale nie znalazłem nic co w 100% mi pomoże.
Dodam że szukałem na forum odpowiedzi na to pytanie ale nie znalazłem 100% pewnej informacji.
Otóż posiadam w atmedze cztery sprzętowe uarty i na jednym z nich ma pracować mój poprzedni już działający moduł(którego już nie mogę przeprogramować aby zmienić coś).
Transmisja wygląda tak:
Z modułu A (atmega32) wysyłam poleceniem :
Print #5 ,"RED" 'to działa poprawnie Moduł B na otrzymaną wiadomość tworzy coś w stylu swojego własnego protokołu i wysyła mi wartości interesujących mnie zmiennych takim poleceniem:
Print Komenda ; Chr(13); ' gdzie komenda to stringo takiej treści:
AT150T223T339T499UP44UW40UK40UB10SP10US1UL0UD1UO0R1088OP0C11C21C31C41C51P10P21P30P40P50P60P70P80KLU1KLD1KLL1KLR1KLM1KLE1R11R22R33R44R510R611R712R813R914QPM1 Dodam że takie zapytanie i odpowiedź będzie wysyłane cyklicznie co 10-20sekund.
Teraz aby w module A który wysłał zapytanie (RED) odebrać ten długi tekst w przerwaniu pomyślałem że zrobię to tak:
Config Com4 = 19200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Serialin3 = Buffered , Size = 160 ,Bytematch = 13 '13 bo znak końca to chr(13)
Chciałem aby po odebraniu znaku końca (tzn. po wywołanym nim przerwaniu) wyciągnąć z bufora dane i przepisać do odpowiedniej zmiennej np . tak:
Serial3bytereceived:
odebrane dane = bufor
ReturnNiestety to nie zadziała bo w przesyłanym tekście może wielokrotnie wystąpić znak 13. Jedyne pewne znaki to te na początku czyli "AT1". Więc nic z tego nie będzie.
Pomyślałem żeby pozbyć się tego :
Config Serialin3 = Buffered , Size = 160 ,Bytematch = 13i zastąpić to tym:
Config Serialin3 = Buffered , Size = 160 ,Bytematch = ALLi odbierać dane w taki sposób:
Serial3bytereceived:
Dane = Inkey(#6)
odebrane_dane = odebrane_dane + Chr(dane)
return
Co prawda to działa (kulawo ale działa) ale jeśli nastąpi szybkie wymienianie się informacji to nie da się zapanować nad odbieraniem w ww. przykład bo lubi zdublować odebrane dane i zamiast odebrać 156 znaków odbieram dwa razy tyle.
Chciałbym koniecznie odbierać dane w przerwaniu (w sumie wysyłać także bym chciał w ten sposób) , i zrobić to tak że jak przyjdą dane(kompletne czyli 156 znaków) to aby zostały przepisane do zmiennej (np. odebrane_dane -oczywiście string) i aby jakaś flaga (np. dane_czekaja = 1 ) informowała że dane czekają.
Dobrze aby można było odbierać i krótsze informacje np: "ABC" wysyłane z urządzenia B także w taki sposob:
Print cisnienie ; Chr(13); ' gdzie cisnienie to stringMoże niezbyt jasno to wszystko opisałem ale tak to wygląda. Wiem że już milion razy były podobne rzeczy na forum ale nie znalazłem nic co w 100% mi pomoże.