Skocz do zawartości

rizone1234

Użytkownicy
  • Zawartość

    6
  • Rejestracja

  • Ostatnio

Reputacja

0 Neutralna

O rizone1234

  • Ranga
    2/10

Ostatnio na profilu byli

Blok z ostatnio odwiedzającymi jest wyłączony i nie jest wyświetlany innym użytkownikom.

  1. /* USER CODE BEGIN PV */ /* Private variables ---------------------------------------------------------*/ uint8_t Received[10]; /* USER CODE END PV */ /* USER CODE BEGIN PFP */ /* Private function prototypes -----------------------------------------------*/ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { uint8_t Data[40]; // Tablica przechowujaca wysylana wiadomosc. uint16_t size = 0; // Rozmiar wysylanej wiadomosci size = sprintf(Data, "Odebrana wiadomosc: %s\n\r",Received); HAL_UART_Transmit_IT(&huart1, Data, size); // Rozpoczecie nadawania danych z wykorzystaniem przerwan HAL_UART_Receive_IT(&huart1, Received, 10); // Ponowne włączenie nasłuchiwania HAL_GPIO_TogglePin(LED_BLUE_GPIO_Port, LED_BLUE_Pin); } /* USER CODE END PFP */ /* USER CODE BEGIN 2 */ HAL_UART_Receive_IT(&huart1, Received, 10); /* USER CODE END 2 */ Kod jest taki jak w kursie o stm32 f4. Ja chciałbym, żeby mi każde słowo się wyświetlało w Real Term, nie tylko o długości 10 znaków, ale także po 8 znaków czy 6 znaków. Reasumując, chciałbym o dowolnej ilości znaków słowo wysłane przez UART, zobaczyć w terminalu. Piszę słowo "pies" chciałbym zobaczyć to słowo, później napisze np. "dzwoneczek" też chciałbym aby to słowo się pojawiło w terminalu.
  2. Mam, pytanie jak stworzyć program który będzie przesyłał dowolną, różną ilość znaków, czyli żeby w terminalu pokazywały się słowa o różnej długości a nie np o stałej wartości 10 znaków?
  3. Przepraszam, że nie odpowiadałem, ale nie miałem czasu. Wszystko gra, przerzucam się teraz na discovery. Cały cza zgłębiam język C oraz stm32.
  4. OK. Postaram się poprawić. Właśnie o to mi chodzi, żeby dane były wysyłane cięgiem po wciśnięciu ENTER. Próbowałem dane wysłać za pomocą Broadcast Command, ale nie wyszło. Jak mógłbyś mi pomóc jak to trzeba poustawiać w Teraterm.
  5. Dziękuję za odpowiedź, ale w kodzie atMegaTona wyrzuca mi błąd w dwóch linijkach i niestety nie działa:( Chodzi o te dwie linijki: while(!UART_RX_RDY); bufor[c] = UART_REG; Nie wiem czemu nie działa, gdyby można było napisać co nie jest tak... Cały kod programu wrzucam tutaj: #include "stm32f10x.h" #define MCP_IODIR 0x00 #define MCP_IPOL 0x01 #define MCP_GPINTEN 0x02 #define MCP_DEFVAL 0x03 #define MCP_INTCON 0x04 #define MCP_IOCON 0x05 #define MCP_GPPU 0x06 #define MCP_INTF 0x07 #define MCP_INTCAP 0x08 #define MCP_GPIO 0x09 #define MCP_OLAT 0x0a void send_char(char c) { while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET); USART_SendData(USART2, c); } int __io_putchar(int c) { if (c=='\n') send_char('\r'); send_char(c); return c; } uint8_t spi_sendrecv(uint8_t byte) { // poczekaj az bufor nadawczy bedzie wolny while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); SPI_I2S_SendData(SPI1, byte); // poczekaj na dane w buforze odbiorczym while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); return SPI_I2S_ReceiveData(SPI1); } void mcp_write_reg(uint8_t addr, uint8_t value) { GPIO_ResetBits(GPIOC, GPIO_Pin_0); spi_sendrecv(0x40); spi_sendrecv(addr); spi_sendrecv(value); GPIO_SetBits(GPIOC, GPIO_Pin_0); } int main(void) { volatile int dly; GPIO_InitTypeDef gpio; SPI_InitTypeDef spi; USART_InitTypeDef uart; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); GPIO_StructInit(&gpio); gpio.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_7; // SCK, MOSI gpio.GPIO_Mode = GPIO_Mode_AF_PP; gpio.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &gpio); gpio.GPIO_Pin = GPIO_Pin_6; // MISO gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &gpio); gpio.GPIO_Pin = GPIO_Pin_0; // CS gpio.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOC, &gpio); GPIO_SetBits(GPIOC, GPIO_Pin_0); GPIO_StructInit(&gpio); gpio.GPIO_Pin = GPIO_Pin_2; gpio.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &gpio); gpio.GPIO_Pin = GPIO_Pin_3; gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &gpio); USART_StructInit(&uart); uart.USART_BaudRate = 115200; USART_Init(USART2, &uart); USART_Cmd(USART2, ENABLE); SPI_StructInit(&spi); spi.SPI_Mode = SPI_Mode_Master; spi.SPI_NSS = SPI_NSS_Soft; spi.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; SPI_Init(SPI1, &spi); SPI_Cmd(SPI1, ENABLE); mcp_write_reg(MCP_IODIR, ~0x0f); char bufor[8]; while(1){ for(int c = 0; c<8; c++){ if(!bufor[c]) break; // jeśli NULL czyli koniec stringa wyjdź z pętli for } if(!(strcmp((const char*)bufor, "onlampy"))){ // porównaj ze sysłą predefiniowaną mcp_write_reg(MCP_OLAT, 0x0f); }else if(!(strcmp((const char*)bufor, "oflampy"))){ mcp_write_reg(MCP_OLAT, 0x00); }else{ printf("Bledny komunikat\n"); } } } Jako terminala uzywam TERATERM
  6. Witam, Mam problem z tym by wpisać całe słowo do terminala, Wciskam jedną literkę i juz terminal reaguje, nie czeka aż wpisze drugą czy trzecią literkę. Proszę poradźcie mi jak wpisać całe słowo np onlampy, aby załączyć diody. Nie chce by sie uruchamiały po jednej wklepanej literce. Problem jest z uartem na stm32. Korzystam z USART2.
×
×
  • Utwórz nowe...