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

[atmega64] Jak przesłać dane z UART1 do UART0? Komunikacja GSM->AVR->PC

bercik11palcow 10 Lip 2014 19:59 1869 11
REKLAMA
  • #1 13784948
    bercik11palcow
    Poziom 18  
    Witam,
    Chciałem zrobić następującą rzecz. Komunikacja: GSM->AVR->PC. Z AVR wysyłam po UART1 komendę AT do modemu GSM, i to co odpowiedział GSM chcę wysłać po UART0 do PC. Niestety nic się nie pokazuję w terminalu. Oba UARTy osobno działają bez problemu. To co odpowiada modem po samym wysłaniu AT przez AVR(bez dalszego przesłania na drugi UART) to:


    Jest to chyba 6 znaków tak?
    Oto mój kod:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Wrzucam tylko część main, ponieważ funkcje odpowiadające za transmisję UART są na pewno dobre, ponieważ tak jak wcześniej pisałem, osobo każdy UART działa poprawnie. Dodam jeszcze, że jak w pętli for zmienię i<5 na i<2 to na terminalu pojawiają się jakieś krzaki.
  • REKLAMA
  • #2 13785587
    el2010tmp
    Poziom 25  
    bercik11palcow napisał:
    bufor_z_pozycja_GPS[i] = USART1_Receive();

    Nie wiem jak wygląda Twoje USART1_Receive(); ale dane z USART należy odbierać wtedy kiedy nadchodzą. Najlepiej za pomocą przerwania od RX. Jak myślisz że dane nadejdą akurat wtedy kiedy wywołasz swoją funkcję USART1_Receive(); to jest to założenie błędne.
  • REKLAMA
  • #3 13785755
    krru
    Poziom 33  
    To by może zadziałało, gdyby atmega miała duży sprzetowy bufor od odbiorniku seriala. Niestety ma tylko 2 bajty. Jeśli to USART1_Receive czeka na odebranie znaku oraz odpowiedz ma zawsze dokładnie 5 znaków to po prostu wywal ten delay.
  • #4 13789533
    bercik11palcow
    Poziom 18  
    no właśnie, jak to jest z tą ilością znaków? Jak mi wysyła takie coś jak podałem w pierwszym poście, to jest to 6 znaków tak? No bo A,T,enter,O,K,enter tak?

    druga sprawa odnośnie tego czekania na dane na uarcie. To chodzi o to że powinienem stworzyć sobie taką funkcję:
    Kod: text
    Zaloguj się, aby zobaczyć kod
    ?
    I później np w obsłudze przerwania:
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #5 13798382
    Konto nie istnieje
    Poziom 1  
  • #6 13798718
    bercik11palcow
    Poziom 18  
    OK, kombinowałem coś ale nadal nie działa. Wysyła mi jakieś śmieci... oto kod:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    I teraz pytanie: Czy w tym przerwaniu odbioru mogę wysyłać normalnie z drugiego uartu dane? Czy to też muszę robić na przerwaniu?
  • #7 13798903
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #8 13798904
    el2010tmp
    Poziom 25  
    W zasadzie to:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    Chyba że USART0 jest wolniejszy od USART1. Wówczas należy ustawić flagę i przesyłać z poza przerwania.
  • REKLAMA
  • #9 13811974
    bercik11palcow
    Poziom 18  
    Zrobiłem coś takiego:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    I wysyła mi jakieś białe znaki. Tzn kursor w konsoli się przemieszcza ale nic nie widzę. Nie wiem też jaką ilością elementów zaiinicjować tablicę, char bufor[0];?

    A no i oba UART'y mam ustawione na 9600;
  • #10 13812033
    el2010tmp
    Poziom 25  
    Czym się różni: char bufor[1]; od char bufor; ?
    Do czego służy zmienna int i ?
    :D
    A tak na poważnie to co masz w funkcjach USART1_Receive i USART_Transmit ?

    Najlepiej wstaw cały kod.
  • #11 13812220
    bercik11palcow
    Poziom 18  
    no tak, przecież mogę zrobić to tak:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    a cały kod wstawiam tutaj:
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #12 13812842
    BlueDraco
    Specjalista - Mikrokontrolery
    I cały czas masz ten sam błąd. Podczas wysyłania łańcucha znaków dostaniesz zwrotnie echo z modemu, ale go nie odbierzesz, bo masz w tym czasie zablokowane przerwania, które odblokujesz w sekundę po zakończeniu transmisji. W drugim obiegu pętli już chyba zadziała...
REKLAMA