Skocz do zawartości

Niepoprawne przesyłanie części znaków ASCII po UART w STM32


Pomocna odpowiedź

Napisano

Cześć. Wydaje mi się, że jest to dość nietypowa sytuacja. Pracując nad wyświetlaczem w pewnym momencie zauważyłem, że UART zamiast małych liter wyświetla tylko jakieś dziwne znaki. Początkowo to zignorowałem bo i tak docelowo UARTa niepotrzebuję, ale później okazało się ze wyświetlacz, który czyta czcionki z karty SD również nie wyświetla poprawnie malych liter. Precyzując zauważyłem, że w obu przypadkach znaki są wyświetlane do 92 numery w kodzie ASCII.  Sterowanie wyświetlaczem w żaden sposób nie jest powiązane z UARTem a problem, który tam występuje, domyślam się że pochodzi z niewłaściwego odczytywania znaków przed graficzną reprezentacją znaku na karcie SD w stylu:

!

--#--

--#--

--#--

-----

--#--

Przez to pewnie pojawia się jakieś przesunięcie w odczycie czcionki.

Próbowałem też wygenerować nowy, pusty projekt gdzie w mainie umieściłem:

HAL_UART_Transmit(&huart3, (uint8_t*)"ABCDabcd", 10, 100);

Oczywiście tylko cztery pierwsze znaki zostały poprawnie wysłane. Probowałem też wyczyścic pamięć przez ST-Linka, również bez pozytywnego efektu. Domyślam się, że obie sytuacje są w jakiś sposób powiązane lecz nie mam pojęcia jak. Sprawdzałem czy nie uwalil się proc i jakiś zapis do pamięci przez co ucina wartości ale w debugerze nic podejrzanego nie zauważyłem. Sprawdzając przez STM Studio np. wartość 'a' widzę ją poprawnie. Czy ktoś ma jakikolwiek pomysł co mogło się wydarzyć? Układ F429ZI Nucleo.

 

Gość
(edytowany)

HAL_StatusTypeDef HAL_UART_Transmit (UART_HandleTypeDef * huart , uint8_t * pData , uint16_t Size , uint32_t Timeout)

Spróbuj czegoś takiego.To zajmie Ci 5minut.

Oczywiście w Twoim rozwiązaniu będzie    HAL_UART_Transmit (& huart13, buff, strlen (buff), 1000);

Oczywiście linia    MX_USART1_UART_Init(); będzie wyglądać odpowiednio.

--------------------------------------------------- 

MX_GPIO_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
 char buff [50] = "dzisiaj jest zimno\r\n";


  while (1)
  {

      HAL_UART_Transmit (& huart1, buff, strlen (buff), 1000);
      //huart: wskaźnik do struktury UART_HandleTypeDef, która zawiera informacje o konfiguracji dla określonego modułu UART.
      //• pData: wskaźnik do bufora danych (elementy danych u8 lub u16).
     // • Rozmiar: Ilość elementów danych (u8 lub u16) do przesłania
     // • Limit czasu: czas trwania limitu czasu
      //HAL_StatusTypeDef HAL_UART_Transmit (UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size, uint32_t Timeout)
      //huart: Pointer to a UART_HandleTypeDef structure that contains the configuration information for the
    //  specified UART module.
    //  • pData: Pointer to data buffer (u8 or u16 data elements).
    //  • Size: Amount of data elements (u8 or u16) to be sent
    //  • Timeout: Timeout duration
HAL_Delay(2000);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

 

Edytowano przez Gieneq
Zachęcam do korzystania z bloku kodu programu

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...