Advertisement
Guest User

Untitled

a guest
Feb 21st, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.01 KB | None | 0 0
  1. #include "stm32f10x.h"
  2. #include "stdio.h"
  3. #include "stdlib.h"
  4. #include "config.h"
  5. #include "string.h"
  6. #include "onewire_comunication.h"
  7. // zmienne buffora USART
  8. #define USART_TXBUF_LEN 128                 //długosc bufora transmisji
  9. #define USART_RXBUF_LEN 128                 //długosc bufora odbioru
  10.  
  11. uint16_t count = 1 * 86;                //wartos do ktorej bedzie zliczal systick zeby wykonac pomiar (okolo 10 sekund)
  12. uint16_t counter;                       //licznik ktory systick bedzie inkremntowal
  13. uint16_t USART_TxBuf[USART_TXBUF_LEN];      //bufor transmisji
  14. uint16_t USART_RxBuf[USART_RXBUF_LEN];      //bufor odbioru
  15.  
  16. uint16_t USART_TX_Empty = 0;    //wskaźnik na pusty element bufora transmisji
  17. uint16_t USART_TX_Busy = 0;     //wskaźnik na zajęty element bufora transmisji
  18. uint16_t USART_RX_Empty = 0;        //wskaźnik na pusty element bufora odbioru
  19. uint16_t USART_RX_Busy = 0;         //wskaźnik na zajęty element bufora odbioru
  20.  
  21. uint16_t temporary_array[50];   //bufor tymczasowy - przygotowanie do transmisji
  22. uint16_t temp;                              //wskaźnik bufora tymczasowego
  23.  
  24. uint16_t string_buff[50];      //bufor tymczasowy do przetworzenia komunikatów
  25.  
  26. int main(void)
  27. {
  28.     counter = count;                    // przypisuje licznikowi wartos do ktorej ma liczyc, zeby za kazdym ponownym uruchomieniem ukladu zrobic pomiar na start
  29.     Config();                           //wywoluje funkcje ktora inicjuje wszystkie niezbedne uklady plytki
  30.  
  31.     send_string("Dostepne komendy:\n", 18);
  32.     send_string("help -----> Wyswietla liste dostepnych komend\n", 46);
  33.     send_string("temp -----> Wyswietla najnowsza zmierzona temperature\n", 54);
  34.     send_string("clear ----> Czysci ekran konsoli\n\r", 34);  //wyswietlanie dostepnych polecen na start
  35.  
  36.     while (1)
  37.     {
  38.  
  39.         if (USART_RX_Busy != USART_RX_Empty) {//sprawdzenie bufora w pojawieniu się nowych danych
  40.                     if (USART_RxBuf[USART_RX_Busy] == ';') {//warunek sprawdzający znak przyjścia komunikatu
  41.                         if (strcmp(temporary_array, "help")) {              //warunek na komunikat "start"
  42.                             send_string("Dostepne komendy:\n", 18);
  43.                             send_string("help -----> Wyswietla liste dostepnych komend\n", 46);
  44.                             send_string("temp -----> Wyswietla najnowsza zmierzona temperature\n", 54);
  45.                             send_string("clear ----> Czysci ekran konsoli\n\r", 34);
  46.                         } else if (strcmp(temporary_array, "temp")) {           //warunek na komunikat "stop"
  47.                             if (now_temperature != -1000){
  48.                                 sprintf(string_buff, "Aktualna temperatura: %.1f °C\n\r", now_temperature);
  49.                                 send_string(string_buff);
  50.                             } else {
  51.                                 send_string("Aktualna temperatura: **** °C\n\r", 31);
  52.                             }
  53.                         } else if (strcmp(temporary_array, "clear")) {      //warunek na komunikat "results"
  54.                             send_string("\033[2J\n\033[0;0H\r", 18);  //komenda czyszczaca teraterm i komenda ustawiajaca kursor w teraterm na samej gorze
  55.                         } else {
  56.                             send_string("Bledne polecenie\n\r", 18);        //warunek na komunikaty nieprawidłowe
  57.                         }
  58.                         temp = 0;
  59.  
  60.                     } else {
  61.                         //zapis danych do tymczasowego bufora z bufora odbioru w oczekiwaniu na znak ";"
  62.                         temporary_array[temp] = USART_RxBuf[USART_RX_Busy];
  63.                         temp++;
  64.                     }
  65.  
  66.                     USART_RX_Busy++;
  67.                     if (USART_RX_Busy >= 128)           //obsługa przepełnienia bufora
  68.                         USART_RX_Busy = 0;
  69.                 }
  70.  
  71. }
  72.  
  73.  
  74. void send_string(char *array_data, uint16_t length) {
  75.  
  76.     __disable_irq();
  77.  
  78.     for (int i = 0; i < length; i++) {
  79.         USART_TxBuf[USART_TX_Empty] = *array_data++;
  80.         USART_TX_Empty++;
  81.         if (USART_TX_Empty >= USART_TXBUF_LEN)
  82.             USART_TX_Empty = 0;
  83.     }
  84.     USART_ITConfig(USART2, USART_IT_TXE, ENABLE);
  85.  
  86.     __enable_irq();
  87.  
  88. }
  89.  
  90.  
  91. void USART2_IRQHandler(void){               //funkcja obslugujaca przerwanie od usarta
  92.  
  93.     if (USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) {
  94.             USART_RxBuf[USART_RX_Empty] = USART_ReceiveData(USART2);
  95.             USART_RX_Empty++;
  96.             if (USART_RX_Empty == USART_RXBUF_LEN)
  97.                 USART_RX_Empty = 0;
  98.         }
  99.  
  100.         if (USART_GetITStatus(USART2, USART_IT_TXE) != RESET) {
  101.             if (USART_TX_Busy != USART_TX_Empty) {
  102.                 USART_SendData(USART2, USART_TxBuf[USART_TX_Busy]);
  103.                 USART_TX_Busy++;
  104.                 if (USART_TX_Busy == USART_TXBUF_LEN)
  105.                     USART_TX_Busy = 0;
  106.             } else {
  107.                 USART_ITConfig(USART2, USART_IT_TXE, DISABLE);
  108.             }
  109.         }
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement