Skocz do zawartości

Kurs STM32L4 – #4 – komunikacja przez UART, debugger


Komentator

Pomocna odpowiedź

Cześć, to już mój kolejny kurs kupiony u was. Na początku jak zawsze osłodzę i jestem wam mega wdzięczny za waszą pracę. Bardzo świetny kurs omówiony w zrozumiałym tonie. Przyznam, że nie jest dosyć łatwy mimo iż mam za sobą trochę programowania w C++. Ale to już nie wasza wina :D.

Piszę z zapytaniem odnośnie ostatniego ćwiczenia z włączaniem diody poprzez komunikację UART. Chodzi mi dokładnie o te linijki kodu:

if (strcmp(line_buffer, "włącz") == 0) {

HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET);

}

Chcemy sprawdzić czy użytkownik napisał "włącz". Ale jak to jest tutaj sprawdzane? O to moje rozumowanie:

W tablicy line_buffer sprawdzamy czy występuje string "włącz". Jeżeli tak to hura, musimy wejść w tego ifa i włączyć pin diody.

Ale dlaczego przyrównujemy funkcję strcmp z wartością 0? Domyślam, się, że strcmp jest jakąś funkcją int która zwraca 1 lub 0. Natomiast nie mogę znaleźć jej kodu/definicji po naciśnięciu ctrl+lewy przycisk myszy.  Przekierowuje mnie tylko do ?biblioteki? string.h a tam do czegoś takiego:

int     strcmp (const char *, const char *);

Link do komentarza
Share on other sites

3 godziny temu, Krisq napisał:

Ale dlaczego przyrównujemy funkcję strcmp z wartością 0? Domyślam, się, że strcmp jest jakąś funkcją int która zwraca 1 lub 0. Natomiast nie mogę znaleźć jej kodu/definicji po naciśnięciu ctrl+lewy przycisk myszy.  Przekierowuje mnie tylko do ?biblioteki? string.h a tam do czegoś takiego:

 

https://www.programiz.com/c-programming/library-function/string.h/strcmp😉 

  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

@atm320 przepraszam, że późno odpisuję. Dopiero dziś mam okazję siąść do tematu L4. Trochę zdawkowo opisałeś problem, na przyszłość lepiej podać za dużo niż za mało szczegółów.

Dnia 18.10.2021 o 19:02, atm320 napisał:

dodam jeszcze że z nadawaniem nie było żadnych problemów. 

Ok, czyli najprostszy przykład z blokującą funkcją działa?

  while (1)
  {
    /* USER CODE END WHILE */

	  uint8_t value;
	  HAL_UART_Receive(&huart2, &value, 1, HAL_MAX_DELAY);

	  printf("Odebrano: %c\n", value);

    /* USER CODE BEGIN 3 */
  }

Mam pobraną najnowszą aktualizację Cuba, wgrany najnowszy ST-Link i nowy projekt. Efekt jest taki:

image.thumb.png.f56d147f4cd701ab0f1c610b1c6956f6.png

Kod nie sprawdza lini końca, tylko pobiera dane aż wskoczy timeout, dlatego to działa na same wciśnięcia klawiszy.

Możliwe, że problem masz z kolejnym przykładem, gdzie buforujesz dane, tu potrzeba przeanalizować sens kodu. Widać, że dane są zbierane aż do końca linii, wiec żeby przetestować kod, musisz wkleić linię tekstu z menu-edit:

image.thumb.png.1bdadb5f550772cdaa9444514369c617.pngimage.thumb.png.e3cf3839aa82cbb1e20c0b155785b938.png

  while (1)
  {
    /* USER CODE END WHILE */

	  uint8_t value;
	  if (HAL_UART_Receive(&huart2, &value, 1, 0) == HAL_OK)
		  line_append(value);


    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

I efekt jest taki:

image.thumb.png.c95e0c2ed132c83e5946868e6d7a728a.png

Daj znać, czy o to chodziło.

 

  • Lubię! 1
Link do komentarza
Share on other sites

Witam, mam takie pytanie, ponieważ nie potrafię znaleźć na nie odpowiedzi we własnym kodzie, jak i w internecie.

Mianowicie próbując stworzyć pierwsze ćwiczenie z kursu (pierwszy przykład, nie zadanie domowe), projekt wyrzuca errora o treści ,, indefined reference to 'HAL_UART_Transmit' ", przy linijce kodu ,, HAL_UART_Transmit(&huart2, (uint8_t*)message, strlen(message), HAL_MAX_DELAY); ".

Całość komunitatu to:

11:31:20 **** Incremental Build of configuration Debug for project 4_stm ****
make -j4 all 
arm-none-eabi-gcc "../Core/Src/main.c" -mcpu=cortex-m4 -std=gnu11 -g3 -DDEBUG -DUSE_HAL_DRIVER -DSTM32L476xx -c -I../Core/Inc -I../Drivers/STM32L4xx_HAL_Driver/Inc -I../Drivers/STM32L4xx_HAL_Driver/Inc/Legacy -I../Drivers/CMSIS/Device/ST/STM32L4xx/Include -I../Drivers/CMSIS/Include -O0 -ffunction-sections -fdata-sections -Wall -fstack-usage -MMD -MP -MF"Core/Src/main.d" -MT"Core/Src/main.o" --specs=nano.specs -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb -o "Core/Src/main.o"
../Core/Src/main.c: In function 'main':
../Core/Src/main.c:90:5: warning: implicit declaration of function 'HAL_UART_Transmit' [-Wimplicit-function-declaration]
   90 |     HAL_UART_Transmit( (uint8_t*)message, strlen(message), HAL_MAX_DELAY);
      |     ^~~~~~~~~~~~~~~~~
arm-none-eabi-gcc -o "4_stm.elf" @"objects.list"   -mcpu=cortex-m4 -T"C:\Users\mikil\STM32CubeIDE\workspace_1.7.0\4_stm\STM32L476RGTX_FLASH.ld" --specs=nosys.specs -Wl,-Map="4_stm.map" -Wl,--gc-sections -static --specs=nano.specs -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb -Wl,--start-group -lc -lm -Wl,--end-group
c:\st\stm32cubeide_1.7.0\stm32cubeide\plugins\com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_2.0.0.202105311346\tools\arm-none-eabi\bin\ld.exe: ./Core/Src/main.o: in function `main':
C:/Users/mikil/STM32CubeIDE/workspace_1.7.0/4_stm/Debug/../Core/Src/main.c:90: undefined reference to `HAL_UART_Transmit'
collect2.exe: error: ld returned 1 exit status
make: *** [makefile:65: 4_stm.elf] Error 1
"make -j4 all" terminated with exit code 2. Build might be incomplete.

11:31:21 Build Failed. 3 errors, 1 warnings. (took 1s.646ms)

Wiem, że pluje się o $huart2, ale totalnie nie wiem co z tym zrobić, może ktoś miał podobny problem.

Z góry dzięki za wszelkie propozycje i poświęcony czas, pozdrawiam.

Link do komentarza
Share on other sites

12 godzin temu, kamilbrach1998 napisał:

Czy ktoś zna fajny odpowiednik tera term na macOS ?

 

Sprawdź TyTools - działa na OS X. Używam tego narzędzia od dawna.

Link do komentarza
Share on other sites

Cześć, mam 2 pytania do tego rozdziału:

1. Odnośnie zadania 2 i 3, zrobiłem je z funkcją printf (to jest kod w pętli while),

		GPIO_TypeDef *port = userButton.buttonPin.port;
		uint16_t pin = userButton.buttonPin.pin;
		GPIO_PinState currentState = HAL_GPIO_ReadPin(port, pin);
		if (userButton.lastState == GPIO_PIN_SET
				&& currentState == GPIO_PIN_RESET) {
			count %= 10;
			printf("Liczba count to: %d\n", ++count);
			if (count == 10) {
				HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET);
			} else {
				HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
			}

		}
		userButton.lastState = currentState;

ale chciałbym zamienić printf'a na hal_uart_transmit i wysyłać np. samą liczbę:

int count = 0;
HAL_UART_Transmit(&huart2, (uint8_t*) &count, sizeof(count), HAL_MAX_DELAY);

Powyższa linia nic nie wyświetla w terminalu (szukałem w internecie, ale nic nie znalazłem), czy ktoś podpowie jak to naprawić?

2. Dlaczego lepiej korzystać z Tera Term a nie z terminala w IDE? Jakieś duże różnice są między nimi?

Edytowano przez jd123
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.