Odbiór danych rs232 Bascom

Pytania, kody i porady dotyczące nie tylko Bascom.
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

Re: Odbiór danych rs232 Bascom

Post autor: Jacek » 06 sty 2021, 14:59

Bartek pomyślał zapewne że to radio - a to wzmacniacz KF hi :)
pozdrawiam Jacek.
Awatar użytkownika
Stefan_25
Posty: 22
Rejestracja: 04 sty 2021, 18:36

Re: Odbiór danych rs232 Bascom

Post autor: Stefan_25 » 08 sty 2021, 20:41

Witam forumowiczów.
Po krótkiej przerwie doszłem co było powodem tego że tylko jeden znak był odczytywany a potem śmieci ,
wyjątek stanowił kod Pana Niveasoft ten kompletnie nic nie odbierał ale to też wyjaśniłem.
Żeby nie przeciągać winą za całe zamieszanie była źle dobrana prędkość komunikacji,
czyli przy rezonatorze 8mHz i prędkości 115200 baud błąd komunikacji wynosi 7.84% dlatego była całkowita klapa.
Obniżenie prędkości do 38400 bo tyle ma domoticz w konfiguracji problem znikł i zaczęło wszystko działać.
No i niestety reasumując komputery klasy PC po prawdzie i teoretycznie odbiorą wszystko a najważniejsze można to podpatrzeć.

Patrząc w bascomie na zakładkę komunikacja wszystko się robi jasne jeśli chodzi o częstotliwość taktowania i prędkość komuikacji.
Jedyny słuszny wybór chcąc korzystać z RS'a to kwarc 11.059200 , brak błędów w komunikacji.

Dziękuję za okazaną pomoc i kod który też działał tylko błąd był nie dopasowania częstotliwości i prędkości.

Pozdrawiam.
Awatar użytkownika
Pikczu
Posty: 390
Rejestracja: 17 sie 2015, 13:46
Lokalizacja: Dublin, Ireland
Kontakt:

Re: Odbiór danych rs232 Bascom

Post autor: Pikczu » 10 sty 2021, 0:07

No i widzisz jakie to proste.
Wystarczyło przysiąść zagadnienie jest banalne.
Awatar użytkownika
Stefan_25
Posty: 22
Rejestracja: 04 sty 2021, 18:36

Re: Odbiór danych rs232 Bascom

Post autor: Stefan_25 » 19 lut 2021, 20:14

Witam Ponownie.
Jak zwykle mam problem z tym nieszczęsnym RS 'em żeby nie zakładać nowego wątku bo szkoda zaśmiecać forum tym razem potrzebuje odebrać 10 bitów danych
i jak zwykle nie umie. Myślałem że uda mi się dostosować kod który dostałem od Was poprzednio ale niestety.
Tym razem problem jest taki że sterownik wysyła takie dziwne dane.
W RealTerm wygląda to tak "ŞŔ{Á™¬„«" po przekonwertowaniu na ASCII "AA C0 71 01 88 02 99 AC 41 AB" nie ma na końcu żadnego znaku.
Pierwsze dwa bity AA i CO są zawsze takie same podobnie jest z ostatnią "AB" i to chyba jest informacja o końcu transmisji.
Potrzebuje je pobrać i wpisać do 10 zmiennych, niestety ale nie potrafię tego zrobić.
Czy może ktoś pomóc ?

Pozdrawiam
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Odbiór danych rs232 Bascom

Post autor: niveasoft » 20 lut 2021, 1:44

Przeniosę to bo trzeba tylko wysil się na temat bo to zakrawa trochę na przesadę. Możesz pisać swoje posty to po co to tutaj w tym wątku?
Awatar użytkownika
Stefan_25
Posty: 22
Rejestracja: 04 sty 2021, 18:36

Re: Odbiór danych rs232 Bascom

Post autor: Stefan_25 » 20 lut 2021, 9:54

Nie rozumie. Co mam zrobić ?
Awatar użytkownika
Pikczu
Posty: 390
Rejestracja: 17 sie 2015, 13:46
Lokalizacja: Dublin, Ireland
Kontakt:

Re: Odbiór danych rs232 Bascom

Post autor: Pikczu » 20 lut 2021, 12:50

Boże drogi przecież to jest banalne Stefan ty nie czytasz a jak nie będziesz czytał my tego za ciebie nie zrozumiemy.
Napisze to dla ciebie żebyś to zrozumiał tylko daj mi parę minut.
Tym razem problem jest taki że sterownik wysyła takie dziwne dane.
W RealTerm wygląda to tak "ŞŔ{Á™¬„«" po przekonwertowaniu na ASCII "AA C0 71 01 88 02 99 AC 41 AB" nie ma na końcu żadnego znaku.
Pierwsze dwa bity AA i CO są zawsze takie same podobnie jest z ostatnią "AB" i to chyba jest informacja o końcu transmisji.
Od początku bo widzę że bardzo nie rozumiesz.
Dane zawsze są przesyłane zero-jedynkowo.
W ASCII jeden znak to jeden bajt w UTF-8 lub UTF-32 to nawet 4 bajty.

Tabela znaków ASCII została stworzona w 1960 roku i reprezentowała znaki używane w języku angielskim.
W miarę rozwoju i komputeryzacji świata, zaszła potrzebna reprezentacji znaków specjalnych używanych w innych językach.
Typowa table ASCII stała się zbyt mała i powstało ASCII extended które tez było za małe a później powstało UTF-8 oraz UTF-32 z wariantami.

Ale to temat na osobną lekturę nie będę wchodził w szczegóły bo nie wszytko pamiętam a temat jest bardzo obszerny, i może od tego rozboleć głowa.
Jako ciekawostka dodam że po standaryzacji kodowanie pokrywa ponad 100.000 znaków używanych przez ludzi.

Skup my się na tym co jest używane przez nas.
Porównując tablice znaków ASCII z UTF-8 (unicode) znaki pisane od numeru dziesiętnego 32 do 127 są identyczne.

Patrząc na dane odebrane przez twój terminal (zapis hex ) widzimy AA C0 71 01 88 02 99 AC 41 AB oraz jako krzaczki ŞŔ{Á™¬„«
To co widzisz terminalu to tylko forma wizualna.
Te znaczki:ŞŔ{Á™¬„« to nic innego jak tylko ASCII (a dokładnie UTF-8 unicode) reprezentacja danych przesłanych binarne to tak w dużym skrócie.

We wcześniejszym twoim poście pokazałeś z rzut ekranu z terminala:
RealTerm_MySensors.jpg
Twój system wysyłał dane jako ASCII. Zaletą tego jest możliwość czytania danych bezpośrednio w terminalu.
Bo zamiast krzaków widziałeś reprezentację danych gotową do odczytu przez ludzkie oko.
Przykładowo wysyłając liczbę 123 program lub urządzenie wysyła najpierw:
Cyfrę 1 (co zero-jedynkowo będzie wysłane jako 0011 0001)
Cyfrę 2 (zero-jedynkowo 0011 0010)
Cyfrę 3 (zero-jedynkowo 00110011)
Natomiast na ekranie terminala dane te wyświetlą się jako 123.
Gdybyś zmienił sposób wyświetlania danych z ASCII na HEX dane te stały by się nie czytelne i wyświetlił by się jako hex reprezentacji 123 czyli 31 32 33.
Krzaki zaczynają się gdy podglądasz znaki z poza zakresu 32 do 127, znaki tak zwane nie drukowane nie dedykowane do czytania.
Gdybyś popatrzył na te dwie strzałeczki "«" ich odpowiednich w hexie to AB.
W tabeli ASCII ich nie znajdziesz, znajdziesz je natomiast w tabeli UTF-8 (unicode) na pozycji 171 z tym ze dodatkowo jest tam jeszcze drugi bajt z przodu ale tego tłumaczył nie mam zamiaru.

Ramka danych która tu pokazałeś "AA C0 71 01 88 02 99 AC 41 AB" nie jest dedykowana do czytania przez człowieka, przynajmniej takie wrażenie robi reprezentacja ASCII.
Jak sam zauważyłeś jest tam nagłówek który zawsze jest identyczny AA C0 oraz AB do terminacji ramki.
A dane to 71 01 88 02 99 AC 41.

Obieranie danych trzeba rozbić na kroki, można to zrobić na wiele sposobów, każdy z nas ma swój ulubiony zapis a raczej nawyk z tym samym efektem końcowym.
Bartek Podał Ci rozwiązanie jak to ogarnąć jeśli dane to typowe ASCII z zakresu znaków drukowanych.

Natomiast żeby odebrać dane w formie jak powyżej musisz znać ich przeznaczenie.
Musisz wiedzieć jakie jest przeznaczenie każdego bajtu i bez tego niestety ani rusz.

Podstawowy kod jest banalny, będzie się składał z konfiguracji UART, koniecznie z buforem.
Oczekiwania na dane czyli wszystkim znane i lubiane Ischarwaiting oraz inputbin.
Może wyglądać w ten sposób:
  1. Regfile = "m32def.dat"
  2.     $crystal = 8000000
  3.     $hwstack = 128
  4.     $swstack = 64
  5.     $framesize = 128
  6.     $baud = 115200
  7.  
  8.     Const _valcheck = 1                                         'sprawdzanie poprawnosci konwersji Val()
  9.     Config Serialin = Buffered , Size = 100
  10.     Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
  11.     Config Lcd = 20 * 4
  12.  
  13.     'Dim Znak As Byte , Dane As String * 60 , Helpb As Byte , N As Byte
  14.     'Dim My_strings(10) As String * 25 , My_bytes(5) As Byte , Testb As Byte
  15.     Dim Tablica(10) As Byte
  16.     Enable Interrupts
  17.  
  18.     cursor off
  19.     cls
  20.     wait 1
  21.  
  22.  
  23.     Do
  24.     While Ischarwaiting() <> 0                              'gdy znak czeka w buforze
  25.     Inputbin , Tablica(1) , 10                              'obierz 10 bajtów zapisz zaczynajac od komórki 1
  26.  
  27.    Wend
  28.  
  29.  
  30.     Locate 1 , 1 : Lcd "D1 " ; Tablica(1)
  31.     Locate 2 , 1 : Lcd "D2 " ; Tablica(2)
  32.     Locate 3 , 1 : Lcd "D3 " ; Tablica(3)
  33.     Locate 4 , 1 : Lcd "D4 " ; Tablica(4)
  34. Waitms 500
  35.     Locate 1 , 1 : Lcd "D5 " ; Tablica(5)
  36.     Locate 2 , 1 : Lcd "D6 " ; Tablica(6)
  37.     Locate 3 , 1 : Lcd "D7 " ; Tablica(7)
  38.     Locate 4 , 1 : Lcd "D8 " ; Tablica(8)
  39.  Waitms 500
  40.  Cls
  41.   Locate 1 , 1 : Lcd "D9 " ; Tablica(9)
  42.   Locate 2 , 1 : Lcd "D10 " ; Tablica(10)
  43.  
  44.     Loop
  45.     End
  46.  
  47. End Sub
Każde okienko tablicy będzie zawierało konkretny bajt danych.
Jedną z zalet wysłanie danych w ten sposób jest szybkość przesyłania i łatwość obróbki.
Wadą jest to iż trzeba znać przeznaczenie każdego bajtu.

Jeśli podasz więcej info na temat przeznaczenia każdego z tych bajtów rozpisze to lepiej na ten moment jest to czyste minimum.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Awatar użytkownika
Stefan_25
Posty: 22
Rejestracja: 04 sty 2021, 18:36

Re: Odbiór danych rs232 Bascom

Post autor: Stefan_25 » 22 lut 2021, 12:46

Dziękuje za cierpliwość i wyrozumiałość.
Teraz rozumie trochę więcej o co chodzi z tymi odczytami.
To co odczytuje to czujnik smogu SDS-011.
Potrzebuje odczytać całe 10 bitów i zamienić miejscami 4 bity , tj. bit 3 i 4 z bitami 5 i 6 i wysłać to z powrotem.
Dzięki temu zabiegowi dostanę informacje najpierw o stężeniu PM-10 a potem PM-2.5.

Dziękuje i Pozdrawiam.
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Odbiór danych rs232 Bascom

Post autor: niveasoft » 22 lut 2021, 15:45

I teraz Stefan proszę Cię załóż osobny temat/wątek i sprawę posuniemy szybciej do przodu ;)
Awatar użytkownika
Stefan_25
Posty: 22
Rejestracja: 04 sty 2021, 18:36

Re: Odbiór danych rs232 Bascom

Post autor: Stefan_25 » 22 lut 2021, 18:12

Tak jest Panie kierowniku, już się robi.
ODPOWIEDZ