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

[STR912] - UART - Niepełny odbiór danych w przerwaniu UART1

bimbarabam 13 Mar 2013 14:03 1893 13
REKLAMA
  • #1 12054923
    bimbarabam
    Poziom 14  
    Posty: 194
    Ocena: 1
    Witam mam taka sprawe. Mam płytkę z str912 i ona jest podlaczona przez RS-232 z innym uC. Drugi uC ma wysyłać po włączeniu zasilania komunikat przez UART do str912. Str912 skonfigurowałem tak, żeby nie używał fifo przy uarcie. Odbiór danych ma mieć miejsce w przerwaniu od UART1. Problem pojawia się jednak taki, że zamiast otrzymywać cały komunikat dostaję tylko jego część - za każdym razem innej długości, a reszta danych juz nie chce przyjsc.
    Handler do przerwania wygląda tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Po prostu plan jest taki, zeby zapisywac kazda odebrana literke do tablicy.
    Ponizej konfiguracja UART
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    A wypisywanie danych sobie robie w jednym tasku freertosa i tu wlasnie wypisuje mi tylko czesc wyrazu
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 12054972
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Dużo potencjalnych miejsc w których potrzebne jest volatile, ale nie ma całego programu... Pozatym strlen() oczekuje zera na końcu łańcucha, skąd to zero się tam weźmie? Urządzenie ZigBee Ci to zero przyśle? Jeśli ten wątek który pokazałeś działa od początku, to też trochę dziwny układ, bo na początku zera może nie być... No chyba że tablicę masz wypełnioną początkowo zerami i nie zapełniasz jej powyżej jakiegoś tam rozmiaru, ale nie widzę żadnego ograniczenia.

    4\/3!!
  • REKLAMA
  • #3 12055027
    bimbarabam
    Poziom 14  
    Posty: 194
    Ocena: 1
    dodałem za wpisywaniem danej do tablicy
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    zeby to zero było na bieżąco dodawane. Dalej to samo. Co do volatile to powyzsza tablica i uart_dane sa volatile.
  • REKLAMA
  • #5 12055158
    bimbarabam
    Poziom 14  
    Posty: 194
    Ocena: 1
    Mieć to mam tą wersje none-eabi od codesourcery, tylko jestem w nim średnio biegły, delikatnie mówiąc. Btw. jak teraz sobie spojrzałem na terminal, to on wypisuje mi w tym tasku jakieś losowe kawałki tego, co dostał:
    [code:1]Se6 225*SevPs1:5
    SePvs1:
    Se6 2f:*Se6:2f:*Sevr8:3*Se6:2f:*Se6s:1:*Se6:2f
    Se6 2f:*Se6:2f:*SeePs1:5
    Se6:23
    Se6:22:*Se6 2f5*Se6es1:*Se6 s1:**Se6 2:
    Se6 1::*Se6 8:
    Se6:2f:*SePv::5**Se6:e1:*Se6::1:*Se6:8:
    Se6:e1:*Se6:2f
    Se6:2e:*Se6:e1:*Se6:22:*Ser f2:5*Se6:2f:*Se6 f25*Se6:2f:*Se6: ::*Se6:2f:*Se6: ::*Se6:2f:*Se6:1::*Se6ds1:**Se6:2f:*Se6:f1:*Se r8::*Se6 ::5
    *Se6 225*Se6 2f5*SevPs1:5*Se6:2f:*Se6 s1:**Se v::5
    *Se6:2f:*Se Ps1:[/code:1] O_O. Czy jest możliwe coś w ten deseń, żeby ten UART jakoś nie wyrabiał przy odbiorze?
  • #6 12055203
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Przede wszystkim jeśli ten wątek od "przekazywania" masz puszczony swobodnie, to on wg mnie powinien wysyłać fragmenty właśnie, bo ty np odbierasz po znaku, a wątek wysyła "do końca" - ile da rady. Innymi słowy całkiem możliwy jest taki układ, że w terminalu odbierzesz najpierw 10%, potem 20%, potem 30%, potem 40% itd. wiadomości...

    Generalnie średnio dobrze to odbieranie i nadawanie jest zrobione [; Jak chcesz to tylko przetestować, to w przerwaniu przerzucaj od razu do docelowego UARTa - wtedy masz przełożenie 1:1 - jeden odebrany znak - jeden nadany.

    4\/3!!
  • #7 12058981
    bimbarabam
    Poziom 14  
    Posty: 194
    Ocena: 1
    Zrobilem tak jak mowiles tj przekierowałem dane na innego uarta bezposrednio w handlerze:
    
    	UART_SendData(UART0, UART1 -> DR);
    i wyrzucilem zapisywanie do tej tablicy w przerwaniu oraz wypisywanie w tasku oczywiscie. I teraz zazwyczaj dostaje caly komunikat, czasem bywa, ze nie i zgubi mi jakas literke po drodze. Tylko jest problem bo po tym komunikacie, powinienem dostawac jeszcze dane co jakis czas (1.5 sek) i albo dostane z 2 razy to co chce albo nie dostane nic :|. I jest pytanie czy mimo ze nie uzywam FIFO powinienem w jakis sposob czekac zwolnienie bufora UARTA? Bo jak jest FIFO zapelnienie FIFO mozna sprawdzić:
    while(UART_GetFlagStatus(UART0, UART_FLAG_TxFIFOFull) != RESET);

    I czy stosujac to tez mozna czekac az UART bedzie gotowy na wyslanie, gdy nie uzywamy FIFO? I tez takie pytanie czy stosowanie FIFO moze niesc za soba jakies pozytywne rezultaty? I czy rejestr, w ktorym sa przechowywane dane odebrane, moze sie w cudzyslowie po jakims czasie zapchac jak sie nie sprawdza jego zajetosci, badz nie czysci?
  • #8 12059190
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Jeśli tylko obydwa UARTy pracują z tą samą prędkością i na tych samych ustawieniach, to nie masz się co przejmować FIFO czy jakimiś oczekiwaniami. Jeśli pracują z różnymi ustawieniami to wtedy w istocie nie będzie działać, ale FIFO Ci nie pomoże, bo zapewne jest zbyt małe.

    4\/3!!
  • #9 12059254
    bimbarabam
    Poziom 14  
    Posty: 194
    Ocena: 1
    Pracuja obydwa z ta sama predkoscia 38400b/s. Bo sprawa wyglada tak, ze jak steruje sobie drugim prockiem z komputera to dostaje ładnie pieknie odpowiedzi, a jak role komputera ma przejac str912 to wlasnie zaczynaja sie problemy w transmisji ktore opisalem powyzej. Jezeli pracowalyby z rozna predkoscia to podejrzewam ze czytalbym krzaki
  • REKLAMA
  • #10 12059310
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    "Obydwa UARTy" w sensie UART0 i UART1 na mikrokontrolerze - wtedy synchronizacja pomiędzy nimi jest "z definicji" (zakładam że nie masz obecnie innych długich przerwań). Profilaktycznie możesz dodać oczekiwanie na pusty bufor nadawczy.

    4\/3!!
  • #11 12059697
    bimbarabam
    Poziom 14  
    Posty: 194
    Ocena: 1
    Poza tym mam jedno przerwanie FIQ od RTC, które jest uruchamiane co 1ms, ale jest bardzo krótkie (ok. 150us).
  • #12 12059704
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Z tego, co napisałeś wynik,a że przerwanie to pochłania 15% mocy układu, więc raczej średnio można je określić jako "bardzo krótkie". (; Chyba, że chodziło Ci o ns, to co innego.

    4\/3!!
  • #13 12059854
    bimbarabam
    Poziom 14  
    Posty: 194
    Ocena: 1
    Czy przerwanie FIQ, może zaburzać jakoś odbierania strumienia danych po uarcie? Bo jezeli takby bylo to chyba i tak powinny byc przerwy w transmisji danych tj dochodzi co ktorass litera tylko czy cos, a nie tak ze pozniej nic nie dochodzi..
  • #14 12081583
    bimbarabam
    Poziom 14  
    Posty: 194
    Ocena: 1
    Mam pytanie czy jest jakas roznica miedzy RS232 a RS232C? bo tak spojrzalem na dokumentacje jednej plytki i ponoc tam jest cos ze jest interfejs rs232c...

Podsumowanie tematu

LABEL_AI_GENERATED
W dyskusji poruszono problem niepełnego odbioru danych przez UART1 w mikrokontrolerze STR912, który jest podłączony do innego mikrokontrolera przez RS-232. Użytkownik zauważył, że zamiast pełnego komunikatu, odbiera jedynie fragmenty danych o zmiennej długości. W odpowiedziach zasugerowano użycie wskaźnika volatile dla zmiennych oraz dodanie znaku końca łańcucha. Użytkownik przetestował przekierowanie danych do innego UARTa, co poprawiło sytuację, ale nadal występowały sporadyczne utraty danych. Podkreślono, że oba UARTy muszą pracować z tą samą prędkością, a także zasugerowano dodanie oczekiwania na pusty bufor nadawczy. Wspomniano również o przerwaniu FIQ od RTC, które może wpływać na odbiór danych.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA