logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[90s2313] lub [atmega128] [bascom] problem z obsługą rs232

metad 18 Sty 2009 15:51 2592 12
REKLAMA
  • #1 6017655
    metad
    Poziom 10  
    witam.
    Mam problem nad rozwiązaniem sposobu przekazywania/sortowania danych wysyłanych do procka i wysłaniem z proca na rs232, a mianowicie:

    przymierzam się do wysterowania po rs232 urządzeniem którego instrukcja słada się z:

    rozkaz dane  (rozkaz(znak - spacja)dane(znak - enter)

    - to działa i żadnych problemów nie ma,

    następnie w odpowiedzi dostaję pors232 jako tekst(z urządzenia do procka):

    (znak - enter) 
    echo polecenia - (rozkaz,(znak - spacja)dane(znak - enter)
    (znak - enter) 
    nagłówek(znak - spacja)wynik(znak - spacja)nagłówek2(znak - spacja)wynik2(znak - spacja)nagłówek3(znak - enter) 



    nagłówek - ma zawsze 4 bajty i jest taki sam.
    wynik - zawsze o długości 9 bajtów np 112233445566778899
    nagłówek2 - 4 bajty, zawsze taki sam
    wynik2 - różna długość
    nagłówek3 - 4bajty, zawsze taki sam

    i z tej odpowiedzi interesuje mnie abym z proca dostał tylko "wynik" +(znak - enter)

    czyli żeby w terminalu odpowiedzi były tylko:
    wynik(znak - enter)
    112233445566778899(znak - enter)
    112233445566778899(znak - enter)
    wynik(znak - enter)
    ....


    mam nadzieje że łopatologicznie i zrozumiale przedstawiłem problem, lecz zabardzo nie wiem jak zrobić żeby program w procku przesiał otrzymane dane i wysłał mi tylko to co chce :cry:
  • REKLAMA
  • #2 6018812
    11111olo
    Poziom 42  
    Tak to napisałeś że nie do końca Cię zrozumiałem. Masz problem z odebraniem czegoś konkretnego czy tylko nie wiesz jak to zrobić?
  • #3 6019044
    metad
    Poziom 10  
    więc tak.....

    jest komp, avr, urządzenie do wysterowania

    avr steruje urządzeniem wysyłając po rs232 instrukcje o strukturze:

    rozkaz dane  (rozkaz(znak - spacja)dane(znak - enter)


    urządzenie odpowiada ciągiem danych o strukturze:

    (znak - enter) 
    echo polecenia - (rozkaz,(znak - spacja)dane(znak - enter) 
    (znak - enter) 
    nagłówek(znak - spacja)wynik(znak - spacja)nagłówek2(znak - spacja)wynik2(znak - spacja)nagłówek3(znak - enter) 


    i chciałbym aby tą odpowiedź również przesłał przez rs232 na kompie, terminalem mógł ją odczytać, lecz nie interesuje mnie tylko ciąg danych który nazwałem "wynik"

    czyli żeby z atmela/atmegi do kompa szła "okrojona" wersja tego co dostaje avr z urządzenia.

    przykład:

    1)avr wysyła do urządzenia:
    avr->AAAAAAAA(znak - spacja)BBBBBBBB(znak - enter)->urządzenie
    2)urządzenie odpowiada:
    urządzenie->(znak - enter)AAAAAAAA(znak - spacja)BBBBBBBB(znak - enter)CCCCCCCC(znak - spacja)DDDDDDDD(znak - spacja)EEEEEEEE(znak - spacja)FFFFFFFF(znak - spacja)ABABABAB(znak - enter)->avr
    3)program w avr "wybiera z odpowiedzi tylko co potrzeba"i wysyła na kompa:
    avr-> DDDDDDDD(znak - enter)->komp

    :D
    Zapewnie trzeba by wykorzystać jeden uart sprzętowy i jeden programowy? o ile jest to możliwe na danym procku (praktycznie moge użyć 90s2313, attiny2313, atmege8535,atmege128) oraz przekształcić odpowiedź którą otrzymuje procek z urządzenia.

    Dodano po 1 [minuty]:

    metad napisał:
    więc tak.....

    jest komp, avr, urządzenie do wysterowania

    avr steruje urządzeniem wysyłając po rs232 instrukcje o strukturze:

    rozkaz dane  (rozkaz(znak - spacja)dane(znak - enter)


    urządzenie odpowiada ciągiem danych o strukturze:

    (znak - enter) 
    echo polecenia - (rozkaz,(znak - spacja)dane(znak - enter) 
    (znak - enter) 
    nagłówek(znak - spacja)wynik(znak - spacja)nagłówek2(znak - spacja)wynik2(znak - spacja)nagłówek3(znak - enter) 


    i chciałbym aby tą odpowiedź również przesłał przez rs232 na kompie, terminalem mógł ją odczytać, lecz nie interesuje mnie cała odpowiedź tylko ciąg danych który nazwałem "wynik"

    czyli żeby z atmela/atmegi do kompa szła "okrojona" wersja tego co dostaje avr z urządzenia.

    przykład:

    1)avr wysyła do urządzenia:
    avr->AAAAAAAA(znak - spacja)BBBBBBBB(znak - enter)->urządzenie
    2)urządzenie odpowiada:
    urządzenie->(znak - enter)AAAAAAAA(znak - spacja)BBBBBBBB(znak - enter)CCCCCCCC(znak - spacja)DDDDDDDD(znak - spacja)EEEEEEEE(znak - spacja)FFFFFFFF(znak - spacja)ABABABAB(znak - enter)->avr
    3)program w avr "wybiera z odpowiedzi tylko co potrzeba"i wysyła na kompa:
    avr-> DDDDDDDD(znak - enter)->komp

    :D
    Zapewnie trzeba by wykorzystać jeden uart sprzętowy i jeden programowy? o ile jest to możliwe na danym procku (praktycznie moge użyć 90s2313, attiny2313, atmege8535,atmege128) oraz przekształcić odpowiedź którą otrzymuje procek z urządzenia.
  • #4 6019061
    11111olo
    Poziom 42  
    Dalej nie do kończ rozumiem :/
    2313 masz podłączonego do komputera?
    To drugie urządzenie jak się komunikuje z AVRem?
  • REKLAMA
  • Pomocny post
    #5 6019148
    dawid512
    Poziom 32  
    Odebrane znaki zapisz do tablicy a potem wybierz te które są ci potrzebne i prześlij je do PC.
  • #6 6019569
    metad
    Poziom 10  
    11111olo napisał:
    Dalej nie do kończ rozumiem :/
    2313 masz podłączonego do komputera?
    To drugie urządzenie jak się komunikuje z AVRem?


    txd z 2313 w tej chwili jest podpięty tylko do urządzenia a txd z urządzenia z urządzenia podpięty przez max232 do kompa i w ten sposób atmel wysyła a na kompie odbieram - w tej chwili, jednakże generuje sie spory plik tekstowy z tego zawierający głównie zbędne dane.
    Komunikacja kompa z avr'em jak i avr'a z urządzeniem odbywać się bedzie przez rs232

    dawid512 napisał:

    Odebrane znaki zapisz do tablicy a potem wybierz te które są ci potrzebne i prześlij je do PC.


    hmm.... chyba nie potrafie, "nie widzę" tego :cry:

    może jakiś przykład bym mógł poprosić?

    nie wiem czemu, ale nie wiem jak zadeklarować tą odpowiedź z urządzenia to tablicy a później z niej wybrać tylko to co potrzebuje
  • REKLAMA
  • #7 6019659
    11111olo
    Poziom 42  
    Czy dane z urządzenia są zawsze takie same?
  • #8 6019706
    metad
    Poziom 10  
    to co nazwałem "wynik2" - jest różnej długości, czasem od jednego znaku do 14 chyba tyle było najwięcej,
    reszta, spacje i entery są "takie same"


    tak jak napisałem wcześniej

    Cytat:
    nagłówek - ma zawsze 4 bajty i jest taki sam.
    wynik - zawsze o długości 9 bajtów np 112233445566778899
    nagłówek2 - 4 bajty, zawsze taki sam
    wynik2 - różna długość
    nagłówek3 - 4bajty, zawsze taki sam
  • REKLAMA
  • #9 6019819
    Jerzy_W
    Poziom 14  
    Cytat:

    Zapewnie trzeba by wykorzystać jeden uart sprzętowy i jeden programowy? o ile jest to możliwe na danym procku (praktycznie moge użyć 90s2313, attiny2313, atmege8535,atmege128) oraz przekształcić odpowiedź którą otrzymuje procek z urządzenia.


    Tam gdzie potrzebne są 2 Uarty stosuję MEGA162 lub MEGA 128, które właśnie posiadają "pełny sprzętowy" drugi UART
  • #10 6020122
    metad
    Poziom 10  
    atmege128 mam pod ręką więc problem hardware mniejszy niż software na który kompletnie nie mam koncepcji,a podobnego tematu nie udało mi sie znaleźć na forum

    edit:

    pewnie można by również użyć dwa avr'y :)
  • Pomocny post
    #11 6041939
    elektrofil
    Poziom 17  
    jeżeli już uzyjesz procka a dwoma uart'ami to budujesz procedure która odbiera od twojego urządzenia string'i
    jeżeli wykryjesz odbior pierwszego string'u (czyli nagłówka)
    np if odebrany="wzór nagłówka jeden" then
    ustaw flagę że nastepny string to będą pierwsze dane
    wtedy : if flaga1=1 then pierwsze_dane=odebrana:reset flaga1
    z drugim nagłówkiem i drugimi danymi podobnie
    i jeżeli wykryjesz trzeci nagłówek czyli:
    if odebrana="wzór trzeciego nagłówka" then
    print pierwsze_dane
    print dugie_dane
    reset flaga3
    endif

    z tym to już raczej sobie poradzisz.

    jeżeli masz zmienną długość stringa jest polecenie LEN(string)
    aby wycinać masz polecenia LEFT RIGHT MID
  • #12 6044419
    rpal
    Poziom 27  
    Ja się po prostu zapytam skoro urządzenie jest sterowane po RS232 to po co w ogóle jest AVR. Nie lepiej sterować po prostu z komputera to i taniej i prościej. Po co ten posrednik po drodze ?
  • #13 6055986
    metad
    Poziom 10  
    @elektrofil - dzięki spróbuje :)

    @rpal
    może taniej i prościej lecz wygodniej aby avrek sam wysyłał komendy a do kompa szedł tylko wynik,

    a te "sterowanie" to prosze traktować w cudzysłowiu :)
    tu nie tyle chodzi o sterowanie czymś lecz o komunikacje z urządzeniem.
    do tej pory całą prace wykonywał program, lecz raz że obciązało to kompa a dwa że działało to wolno,

    przykładowo podam że na kompie udawało się uzyskać ok 60000 (nie błąd, 60 tysięcy) cykli wyślij rozkaz do urządzenia i odbierz wynik w przeciągu 1 godziny.
    Przy większej liczbie były błędy w komunikacji.
    Możliwe że da się to jakoś usprawnić, ale
    przy zastosowaniu avr'ka tylko do wysyłania rozkazów, tych cykli wzrosło prawie 7 krotnie, lecz w związku z tym iż wynik nie był "obrobiony" i komp logował go w całości to w przeciągu godziny generowało plik tekstowy wielkości ponad 20MB
    Nie jest problemem przerobić tak powstały plik, lecz po prostu robi się on zbyt duży zakładając chociażby 24godziny działania programu.

    Czy z avr'em wychodzi drożej? może tak, ale kosztów avr'a nie wliczam gdyż mam kilkanaście różnych :)
    prościej?
    napisanie programu do avr'ka zajeło może 5 min. żaden problem, gorzej z samym filtrowaniem wyniku.
REKLAMA