Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 5 sty 2025, o 14:01


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 19 ] 
Autor Wiadomość
PostNapisane: 10 paź 2015, o 10:16 
Offline
Użytkownik

Dołączył(a): 06 maja 2013
Posty: 25
Pomógł: 0

Witam wszystkich forumowiczów,
niedawno zacząłem działać z stm32, aktualnie jestem na etapie odbierania stringów przez procek.
Działam w środowisku coocox, na podstawie dostępnych przykładów odpaliłem odbieranie w przerwaniu pojedynczych bajtów (znaków).
Problem napotkałem gdy chcę odebrać całego stringa, podglądam co się dzieje na debugu.
Następująco przerwanie od odbioru zostaje wywołane gdy puszcze danego stringa z apki na PC.
Następnie pobierany jest pierwszy znak i zapisywany do bufora.
No i na tym byłoby koniec...
W buforze zawsze przechowywany jest tylko pierwszy znak z tego stringa.

Czegoś mi brakuje w kodzie zapewne, tylko nie wiem czego...
Siedziałem w nocy i nic jeszcze nie znalazłem na rozwiązanie problemu, a raczej to jakaś banalna sprawa.

ostatnio testowałem na 115200 bodów poprzednio na 9600, ale to raczej nie ma znaczenia

Miał ktoś kiedyś podobny "problem"? Proszę o wskazówki jak rozwiązać ten babol z odbiorem danych.

jedna z realizacji przerwania odbiorczego...
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


UART init prosto z przykładu coocoxowego
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


oraz konfiguracja uarta i gpio
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Ostatnio edytowano 10 paź 2015, o 10:53 przez wojmajster, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 paź 2015, o 10:29 
Offline
Moderator zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 18 lip 2012
Posty: 3206
Lokalizacja: Kraków - obok FAB5 ATMEL'a
Pomógł: 91

A listingów ARM to nie dotyczy?? topic7402.html

_________________
http://www.jaglarz.info



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 paź 2015, o 11:03 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 maja 2014
Posty: 1089
Pomógł: 34

Ogólnie nie patrząc na kod to musiałbyś zapisywać do bufora zwiększając index z każdym odebrany bajtem. No i żeby wywołać jakąś akcje to ustal sobie znak jakiś który będzie wyzwalac odczyt bufora

Sent from my GT-I9506 using Tapatalk

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 paź 2015, o 11:37 
Offline
Użytkownik

Dołączył(a): 06 maja 2013
Posty: 25
Pomógł: 0

Zapisuje i zwiększam indeks, tylko że on raz wskoczy i to wszystko(pierwsza litera ze stringu w buforze).
Wydaje mi się, że przydałaby się pętla do momentu wciągnięcia całego stringa do bufora.
Tylko z jakim warunkiem ? Czegoś sprzętowo możliwe, że nie ustawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 paź 2015, o 11:46 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 maja 2014
Posty: 1089
Pomógł: 34

Ciężko mi się czyta kod na komorce :) mógłbyś zastosować maskę bitowa do zerowania index ? Czyli coś w rodzaju index=(index+1) & 0x08

Sent from my GT-I9506 using Tapatalk

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 paź 2015, o 11:48 
Offline
Użytkownik

Dołączył(a): 29 lip 2014
Posty: 195
Pomógł: 44

Witam,

przyczyną Twojego problemu jest linia:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Nie da się skorzystać z operatora sizeof dla tablic wewnątrz funkcji ( to tak w skrócie - w tym wypadku policzy Ci sizeof dla wskaźnika do pierwszego elementu tablicy ). Podstaw stałą, albo wcześniej policz rozmiar i na próbę umieść w zmiennej globalnej.

Pozdrawiam, Quadman.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 paź 2015, o 12:53 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 18 lip 2012
Posty: 208
Lokalizacja: Kraków
Pomógł: 16

W stringu na końcu wysyłaj zawsze określony znak. Przykładowo może to być \CR, jako terminala polecam użyć RealTerm, który z automatu dołączy Ci ten znak do wysłanego stringa.
W każdym przerwaniu sprawdzaj czy przypadkiem nie odebrałeś znaku \CR. Jeśli tak to zakończ odbieranie, ustaw na przykład jakąś flagę. Wtedy już wiesz, że nadawanie zostało zakończone.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 paź 2015, o 14:10 
Offline
Użytkownik

Dołączył(a): 06 maja 2013
Posty: 25
Pomógł: 0

Dziękuje za szybki odzew.
Ten sizeof zastąpiłem, ale w sumie nie on mi psuje to odbieranie.
Program zachowuje się tak:
gdy wysyłam stringa kilka literek np. "las\n"
zostaje wywołane przerwanie void USART1_IRQHandler(void)
mam tu breakpointa
sprawdzany jest warunek
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

co on dokładnie sprawdza to nie wiem, jakiś status bitów od danych przychodzących
warunek spełniony wtedy odczytuje bajty tu jest problem
wywołanie
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
zwraca pierwszy bajt stringu pierwszą literkę 'l'
kolejne wywołanie
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
według mnie powinno dać kolejny bajt literkę 'a', a on swoje znów pokazuje pierwszy znak w stringu 'l'
i to jest problem, nie mogę pobrać kolejnych znaków ze stringu
Chyba tak to się robi jak opisałem? Czegoś nie ustawiam ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 paź 2015, o 15:13 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8596
Pomógł: 337

zerknij też tutaj : http://www.sunduino.pl/wordpress/start- ... ry-6-uart/

_________________
Zbuduj swój system [url=https://helion.pl/ksiazki/w-labiryncie-iot-budowanie-urzadzen-z-wykorzystaniem-ukladow-esp8266-i-esp32-andrzej-gromczynski,wlablo.htm#format/d]IOT[/url]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 paź 2015, o 17:10 
Offline
Użytkownik

Dołączył(a): 06 maja 2013
Posty: 25
Pomógł: 0

SunRiver porównywałem z Twoim poradnikiem, wypatrzyłem że nie miałem w inicjalizacji ustawionego RCC_APB2Periph_AFIO.
Niestety nadal nie rozwiązało to mojego problemu.
Możecie spojrzeć jeszcze na samo przerwanie u mnie w najprostszej wersji wygląda to tak:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Czy to powinno rozkładać odbieranego 4 elementowego stringa i upychać go do tablicy StringLoop?
Raczej błędu w f-cji obsługi przerwania nie ma ? chyba najprostsze co może być.
A efekt tego to pierwszy znak odbiera początkowy i przypisuje go na pozycję 0 1 2 i 3 w StringLoop.

Dziękuje za wskazówki, jak wieczorem znów do tego usiąde to chyba przepisze wszystko od początku bez kopiowania.
Pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 paź 2015, o 17:40 
Offline
Użytkownik

Dołączył(a): 29 lip 2014
Posty: 195
Pomógł: 44

Witam ponownie.

W buforze USART-a masz 1 znak i co przerwanie od odebranego znaku musisz go przepisać do bufora, najprościej jak się da, aby odebrać 4 znaki :


Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Pozdrawiam, QuadMan.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 paź 2015, o 17:58 
Offline
Użytkownik

Dołączył(a): 06 maja 2013
Posty: 25
Pomógł: 0

Ok czyli to jest przerwanie od odebranego znaku, więc na debugu sobie podgladam to przerwanie.
Wysyłam string wchodzi w przerwanie zatrzymuje sie na breakpoincie wykonuje funkcje.
Mam pierwszy znak stringa w elemencie 0 tablicy.
Robie run czekam czekam i już wiecej nie wchodzi mi w to przerwanie.
Gdy wyśle jeszcze raz ten tekst to oczywiście odbiorę znów pierwszą literę.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 paź 2015, o 18:43 
Offline
Użytkownik

Dołączył(a): 29 lip 2014
Posty: 195
Pomógł: 44

Nie wiem jak w CooCox-ie z debugowaniem przerwań, ale nie wiem jak właściwie to robisz.
Po mojemu, to powinieneś:
1. Uruchomić program z breakpointem na końcu tego przerwania.
2. Wpisać 1 znak z terminala, wtedy program powinien się zatrzymać na tym breakpoincie.
3. Podejrzeć tą tablicę i uruchomić dalej program.
4. Wpisać kolejny znak z terminala, itd.

Czy tak to robisz?

Dopisane: A może po prostu daj "togglowanego" LED-a w przerwaniu, uruchom program bez debugera i zobacz, czy Ci ten LED zmienia stan po wysyłaniu kolejnych znaków z terminala.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 paź 2015, o 19:01 
Offline
Użytkownik

Dołączył(a): 06 maja 2013
Posty: 25
Pomógł: 0

QuadMan dzięki za wskazówki, tak jak pisałem z pojedynczymi znakami to nie ma problemu bufory się zapełniają jak należy.
Postępując według Twoich punktów to działa.
Problem mam gdy wysyłam cały ciąg znaków, całego stringa z apki na PC lub terminala.
Czyli z kompa do stm-a wysyła fizycznie bajt bajt bajt bajt, z których składa się string.
To przerwanie nie chce mi rozłożyć stringa na pojedyncze znaki, łapie pierwszy i koniec.

Nie wiem czy problem leży np. w szybkości transmisji, może w ustawieniu jakiejś flagi czy coś na podobe.
Dopiero zaczynam działanie z STM32, Wasze posty sugerują mi, że raczej nie robie błędu w samym odbiorze, na AVRach to by tak działało.

Ide dolutować ledy może to będzie najszybszy debug;



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 paź 2015, o 19:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8596
Pomógł: 337

wiesz nie mam kłopotu ze stringiem ... na STM32
Nie wiem czy czytałeś Mikrokontrolery Kinetis dla .....
opisałem tam mechanizm do odbioru stringa (zdania $GPGA z GPS na uarcie)
łącznie z mechanizmem parsowania i wyłuskiwania danych które mnie interesują
Tej metody używam też na STM32 i LPC i działa zawsze bez błędnie)

_________________
Zbuduj swój system [url=https://helion.pl/ksiazki/w-labiryncie-iot-budowanie-urzadzen-z-wykorzystaniem-ukladow-esp8266-i-esp32-andrzej-gromczynski,wlablo.htm#format/d]IOT[/url]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 paź 2015, o 04:32 
Offline
Użytkownik

Dołączył(a): 06 maja 2013
Posty: 25
Pomógł: 0

Witam wszystkich ponownie ;)
Wstałem sprawdziłem i działa, może nawet i działało od początku.
Stwierdziłem, że spoko narzędzie ten debug, niestety tu się przez to zapętliłem i szukałem na siłę błędu.
Na debugu działa to tak jak napisałem, dlaczego? nie wiem.
Ale jak wgrałem sam program, zrobiłem poprawnie wyciąganie stringa z buforu odbiorczego to po prostu działa jak należy.

Dziękuje za zainteresowanie tematem i udzielone wskazówki ;)

Moglibyście kiedyś w wolnej chwili sprawdzić, czy u Was debug w tym przerwaniu działa tak samo jak u mnie?
Może w innym środowisku takie debugowanie działa ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 paź 2015, o 11:26 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8596
Pomógł: 337

Ja używam debugera z Segera i jest naprawdę doskonały , podobnie jak
Debugowanie pod VS dla VisualGDB i w MDK keila

nie używam innych środowisk .

_________________
Zbuduj swój system [url=https://helion.pl/ksiazki/w-labiryncie-iot-budowanie-urzadzen-z-wykorzystaniem-ukladow-esp8266-i-esp32-andrzej-gromczynski,wlablo.htm#format/d]IOT[/url]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 paź 2015, o 14:46 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 18 maja 2014
Posty: 126
Pomógł: 12

wojmajster napisał(a):
Na debugu działa to tak jak napisałem, dlaczego? nie wiem.

Nie działa Ci, bo po odebraniu pierwszego bajtu zatrzymujesz program breakpointem w przerwaniu, ale to nie zatrzymuje nadawania przez aplikacje na komputerze. Więc zanim zdążysz wznowić działanie programu, twój string już dawno jest wysłany i dlatego nie masz kolejnych przerwań.

_________________
Pozdrawiam, Adrian.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 paź 2015, o 17:37 
Offline
Użytkownik

Dołączył(a): 06 maja 2013
Posty: 25
Pomógł: 0

Federerer napisał(a):
Nie działa Ci, bo po odebraniu pierwszego bajtu zatrzymujesz program breakpointem w przerwaniu, ale to nie zatrzymuje nadawania przez aplikacje na komputerze. Więc zanim zdążysz wznowić działanie programu, twój string już dawno jest wysłany i dlatego nie masz kolejnych przerwań.


To teraz takie proste, dzięki za zainteresowanie problemem i pomoc ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 19 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 4 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO