Przez wyjścia UART można wysyłać tekstowe wiadomości do terminala. Do ich odczytu użyjemy programu PuTTy

Konfiguracja PuTTy

  • Serial
  • Speed: 115200 bit/s (można zmienić w STM32CubeMX – Pinout – Connectivity – USART2 – Parameter Settings- Baud Rate)
  • Port COM3 (trzeba odczytać w Menadżerze urządzeń Windows który COM)

CubeMX

W Cube MX standardowo w Connectivity klikamy w USART2 i zaznaczamy Asynchroneus

Program C

1
2
3
  /* USER CODE BEGIN 2 */
  const char *text="Ok "; //text to send via UART to Putty
  /* USER CODE END 2 */

To jest nasz cout: &huart2 to zmienna systemowa (będzie w wygenerowanym pliku u góry) odpowiadająca temu portowi. Text to string C czyli (const char *)

Potem jest ilość bajtów do wysłania i czas timeout;

Można go dodać do pętli while(1):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/* USER CODE BEGIN 3 */
          HAL_GPIO_WritePin(externLed_GPIO_Port, externLed_Pin, GPIO_PIN_RESET);
          HAL_Delay(500);
          HAL_GPIO_WritePin(externLed_GPIO_Port, externLed_Pin, GPIO_PIN_SET);
          HAL_Delay(500);
          HAL_UART_Transmit(&huart2, text, strlen(text), 1000);
         /* if (HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin) == GPIO_PIN_SET) //wcisniety
          {
              HAL_GPIO_WritePin(greenLed_GPIO_Port, greenLed_Pin, GPIO_PIN_RESET);
          }
          else
          {
                  HAL_GPIO_WritePin(greenLed_GPIO_Port, greenLed_Pin, GPIO_PIN_SET);
          }*/

  }
  /* USER CODE END 3 */

Nadpisanie printf

Można skorzystać w formatowania stringów wbudowanego w C++ (printf) pisząc np. takie makro w sekcji (max 100 znaków out)

1
2
3
4
5
6
7
8
9
10
11
12
/*USER CODE BEGIN PFP*/
// printf():
//libraries may be in previous section, otherwise- without them -warning: implicit definition of strlen and others:
#include <stdio.h>
#include <string.h>

char buf_printf[100]; //max printf length
#define printfx(f_, ...) snprintf(buf_printf, 100, (f_), ##__VA_ARGS__); \
HAL_UART_Transmit(&huart2, (uint8_t*)buf_printf, strlen(buf_printf), 1000);


//...
/*USER CODE END PFP*/

używamy prawie jak printf:

1
printfx("%d %s %X", 10, "aa", 12);

Liczby zmiennoprzecinkowe %f, double

Niestety standardowo obsługa liczb zmiennoprzecinkowych jest wyłączona (można zadeklarować, skompiluje się, ale nic nie wypisze), aby ją włączyć należy wejść w opcje:

  1. Project -> Propeties
  2. C/C++ Build
  3. Settings
  4. Tool Settings (po prawej zakładka)
  5. MCU Settings
  6. Runtime Library: (zmienić na) Standard C
  7. Zaznaczyć OBA checkboxy poniżej: Use float… ,Use float….
  8. Apply

UWAGA! Nie włączajcie obsługi tych liczb do czasu, gdy będą potrzebne. Te operacje trwają długo w porównaniu do typów w stylu uint32_t. CPU w PC ma specjalną jednostkę zmiennoprzecinkową.

C, STM32