Skocz do zawartości

Kurs STM32 F1 HAL - #5 - komunikacja z komputerem, UART


Pomocna odpowiedź

Sorki za trywialne pytanie ale qrcze treminal mi nie smiga

czy wystarczy podłączone usb ta jak go programuj i w terminalu wybiorę com prze który programuje

żaden przykład nie lata

sorki mój błąd w ustawieniach

opanowane

  • 5 miesiące później...
(edytowany)

Witam, czy aby korzystać z terminala wystarczy pobrać plik exe? Do czego jest ten zip?

 

 

Edytowano przez Pawpob
Rozwiazanie problemu

@Pawpob witam na forum 🙂

To czy wybierzesz exe czy zip nie ma znaczenia. Zip to spakowany exe, tak by plik przy pobieraniu zajmował mniej i pobrał się szybciej. Niektórzy też mają obawy przed pobieraniem "gołego" exe'ca.

 

(edytowany)

Póki co nie wymyśliłem nic innego niż odbieranie bajt po bajcie. Zadanie 5.2:

#include <string.h>
#include "stm32f1xx.h"

#define RX_BUFFER_SIZE 4	//String size + 1

UART_HandleTypeDef uart;

void send_string(char* s){
	HAL_UART_Transmit(&uart, (uint8_t*)s, strlen(s), 1000);
}

int main(void){

	SystemCoreClock = 8000000;
	HAL_Init();

	__HAL_RCC_GPIOA_CLK_ENABLE();
	__HAL_RCC_USART2_CLK_ENABLE();

	GPIO_InitTypeDef inout;

	/*PIN PA2 AS TX (ALTERNATE)*/
	inout.Mode				=	GPIO_MODE_AF_PP;
	inout.Pin				=	GPIO_PIN_2;
	inout.Pull				=	GPIO_NOPULL;
	inout.Speed				=	GPIO_SPEED_FREQ_LOW;
	HAL_GPIO_Init(GPIOA, &inout);

	/*PIN PA3 AS RX (ALTERNATE)*/
	inout.Mode				=	GPIO_MODE_AF_INPUT;
	inout.Pin				=	GPIO_PIN_3;
	HAL_GPIO_Init(GPIOA, &inout);

	/*PA6 AS RED - 1*/
	inout.Mode				=	GPIO_MODE_OUTPUT_PP;
	inout.Pin				=	GPIO_PIN_6;
	HAL_GPIO_Init(GPIOA, &inout);

	/*PA7 AS YELLOW - 2*/
	inout.Mode				=	GPIO_MODE_OUTPUT_PP;
	inout.Pin				=	GPIO_PIN_7;
	HAL_GPIO_Init(GPIOA, &inout);

	/*PA9 AS GREEN - 3*/
	inout.Mode				=	GPIO_MODE_OUTPUT_PP;
	inout.Pin				=	GPIO_PIN_9;
	HAL_GPIO_Init(GPIOA, &inout);

	/*UART2 CONFIG*/
	uart.Instance			=	USART2;
	uart.Init.BaudRate		=	115200;
	uart.Init.WordLength	=	UART_WORDLENGTH_8B;
	uart.Init.Parity		=	UART_PARITY_NONE;
	uart.Init.StopBits		=	UART_STOPBITS_1;
	uart.Init.HwFlowCtl		=	UART_HWCONTROL_NONE;
	uart.Init.OverSampling	=	UART_OVERSAMPLING_16;
	uart.Init.Mode			=	UART_MODE_TX_RX;
	HAL_UART_Init(&uart);

	/*VARIABLES*/
	uint8_t EndOfTransmissionFlag = 0;
	char str[RX_BUFFER_SIZE];
	uint8_t *ptr = (uint8_t *)str;
	uint8_t i = 0;

	memset(str, 0, strlen(str));	//Clearing buffer

	while(1){
		if(__HAL_UART_GET_FLAG(&uart, UART_FLAG_RXNE) == SET){
			uint8_t value;
			HAL_UART_Receive(&uart, &value, 1, 1000);
			*(ptr + i) = value;
			send_string(&str[i]);
			i++;
			if(i == RX_BUFFER_SIZE - 1){
				i = 0;
				EndOfTransmissionFlag = 1;
				send_string("\r\n");
			}
		}
		if (EndOfTransmissionFlag == 1) {
			if (strcmp(str, "on1") == 0) {
				send_string("RED ON\r\n");
				HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);
			}
			if (strcmp(str, "of1") == 0) {
				send_string("RED OFF\r\n");
				HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);
			}
			if (strcmp(str, "on2") == 0) {
				send_string("YELLOW ON\r\n");
				HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET);
			}
			if (strcmp(str, "of2") == 0) {
				send_string("YELLOW OFF\r\n");
				HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);
			}
			if (strcmp(str, "on3") == 0) {
				send_string("GREEN ON\r\n");
				HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET);
			}
			if (strcmp(str, "of3") == 0) {
				send_string("GREEN OFF\r\n");
				HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);
			}
			EndOfTransmissionFlag = 0;
			memset(str, 0, strlen(str));		//Clearing buffer
		}
	}
}

 

Ok, znalazłem trochę czasu i udało mi się zrobić odbieranie wielu bajtów na raz, zmiany w kodzie:

(...)
/*VARIABLES*/
	char str[RX_BUFFER_SIZE] = "";

	while (1) {
		memset(str, 0, strlen(str));		//Clearing buffer

		if (__HAL_UART_GET_FLAG(&uart, UART_FLAG_RXNE) == SET) {
			HAL_UART_Receive(&uart, (uint8_t *) str, 3, 1000);
			send_string(str);
			send_string("\r\n");
		}
		if (strcmp(str, "on1") == 0) {
			send_string("RED ON\r\n");
			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);
		}
		if (strcmp(str, "of1") == 0) {
			send_string("RED OFF\r\n");
			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);
		}
		if (strcmp(str, "on2") == 0) {
			send_string("YELLOW ON\r\n");
			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET);
		}
		if (strcmp(str, "of2") == 0) {
			send_string("YELLOW OFF\r\n");
			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);
		}
		if (strcmp(str, "on3") == 0) {
			send_string("GREEN ON\r\n");
			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET);
		}
		if (strcmp(str, "of3") == 0) {
			send_string("GREEN OFF\r\n");
			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);
		}
	}
(...)

 

Edytowano przez Rogal
Dodanie kodu z odbieraniem wielu bajtów na raz
  • Pomogłeś! 2
  • 1 rok później...
(edytowany)

Cześć! Próbowałem zrobić odbieranie bajt po bajcie na zasadzie dodawania ich do stringa. Uwzględniłem znak końca tekstu, ale nie działa. Patrzyłem w debuggerze i po wpisaniu np "on1" elementy arraya "wyraz" są kompletnie inne niż spodziewane - dociera tam tylko sygnał EOT.skrin.thumb.png.72b7995a1c3458d0761903b0f6042e05.png 

#include <string.h>
#include "stm32f1xx.h"

UART_HandleTypeDef uart;

void send_string(char* s)
{
	HAL_UART_Transmit(&uart, (uint8_t*)s, strlen(s), 1000);
}

int main(void)
{
	SystemCoreClock = 8000000;	// taktowanie 8Mhz
	HAL_Init();

	__HAL_RCC_GPIOA_CLK_ENABLE();
	__HAL_RCC_USART2_CLK_ENABLE();

	GPIO_InitTypeDef gpio;
	gpio.Mode = GPIO_MODE_AF_PP;
	gpio.Pin = GPIO_PIN_2;
	gpio.Pull = GPIO_NOPULL;
	gpio.Speed = GPIO_SPEED_FREQ_LOW;
	HAL_GPIO_Init(GPIOA, &gpio);

	gpio.Mode = GPIO_MODE_AF_INPUT;
	gpio.Pin = GPIO_PIN_3;
	HAL_GPIO_Init(GPIOA, &gpio);

	uart.Instance = USART2;
	uart.Init.BaudRate = 115200;
	uart.Init.WordLength = UART_WORDLENGTH_8B;
	uart.Init.Parity = UART_PARITY_NONE;
	uart.Init.StopBits = UART_STOPBITS_1;
	uart.Init.HwFlowCtl = UART_HWCONTROL_NONE;
	uart.Init.OverSampling = UART_OVERSAMPLING_16;
	uart.Init.Mode = UART_MODE_TX_RX;
	HAL_UART_Init(&uart);

	while (1)
	{
		if (__HAL_UART_GET_FLAG(&uart, UART_FLAG_RXNE) == SET)
		{
			uint8_t value[4];
			HAL_UART_Receive(&uart, &value[0], 1, 1000);
			HAL_UART_Receive(&uart, &value[1], 1, 1000);
			HAL_UART_Receive(&uart, &value[2], 1, 1000);
			HAL_UART_Receive(&uart, &value[3], 1, 1000);
			char wyraz[4];
			wyraz[0] = (char)value[0];
			wyraz[1] = (char)value[1];
			wyraz[2] = (char)value[2];
			wyraz[3] = (char)value[3];
			char warunek[4] = {'o', 'n', '1', '\n'};
			if (strcmp(wyraz,warunek) == 0) {
				send_string("dziala\r\n");
			}
		}
	}
}

 

Edytowano przez Destroyer2137
doprecyzowanie pytania

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