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

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

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

 

Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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