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 1989 11
REKLAMA
  • #1 13784948
    bercik11palcow
    Poziom 18  
    Posty: 406
    Pomógł: 2
    Ocena: 48
    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  
    Posty: 713
    Pomógł: 97
    Ocena: 44
    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  
    Posty: 1819
    Pomógł: 230
    Ocena: 214
    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.
  • REKLAMA
  • #4 13789533
    bercik11palcow
    Poziom 18  
    Posty: 406
    Pomógł: 2
    Ocena: 48
    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  
    Posty: 406
    Pomógł: 2
    Ocena: 48
    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  
  • #8 13798904
    el2010tmp
    Poziom 25  
    Posty: 713
    Pomógł: 97
    Ocena: 44
    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  
    Posty: 406
    Pomógł: 2
    Ocena: 48
    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  
    Posty: 713
    Pomógł: 97
    Ocena: 44
    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  
    Posty: 406
    Pomógł: 2
    Ocena: 48
    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
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    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...

Podsumowanie tematu

LABEL_AI_GENERATED
W dyskusji poruszono problem przesyłania danych z UART1 do UART0 w mikrokontrolerze ATmega64 w kontekście komunikacji z modemem GSM. Użytkownik próbował wysłać komendę AT do modemu GSM przez UART1, a następnie przekazać odpowiedź do PC przez UART0, jednak napotkał trudności z odbiorem danych. Uczestnicy dyskusji sugerowali, aby używać przerwań do odbierania danych, zamiast czekać na określoną liczbę znaków. Podkreślono, że w przerwaniu powinno się odbierać pojedynczy znak i natychmiast przesyłać go do drugiego UARTa. Wskazano również na konieczność odblokowania przerwań po zakończeniu transmisji, aby umożliwić odbiór echa z modemu. Użytkownik zaktualizował swój kod, aby poprawić odbiór danych, ale nadal miał problemy z wyświetlaniem odpowiedzi w terminalu.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA