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

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.