Advertisement
Guest User

Untitled

a guest
Feb 22nd, 2020
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.01 KB | None | 0 0
  1. uint8_t USART_kbhit() {
  2.     if (USART_RX_Empty == USART_RX_Busy) { // Jeżeli bufor jest pusty to zwraca '0'.
  3.         return 0;
  4.     } else {
  5.         return 1;
  6.     }
  7. }
  8.  
  9. uint8_t USART_getchar() {
  10.     uint8_t tmp;
  11.     if (USART_RX_Empty != USART_RX_Busy) {
  12.         tmp = USART_RxBuf[USART_RX_Busy];
  13.         USART_RX_Busy++;
  14.         if (USART_RX_Busy >= USART_RxBuf_LEN) USART_RX_Busy = 0;
  15.         return tmp;
  16.     } else {
  17.         return 0;
  18.     }
  19. }
  20.  
  21. uint8_t USART_getline(char *buf) {
  22.     static uint8_t bf[128]; // Zmienna lokalna służąca składowaniu pobranych znaków.
  23.     static uint8_t index = 0;
  24.     int i;
  25.     uint8_t ret;
  26.     while (USART_kbhit()) {
  27.         /*
  28.          * Sprawdzenie czy jest coś w buforze.
  29.          * W przypadku, gdy bufor nie jest pusty to wchodzi do środka 'while'a'
  30.          */
  31.                 bf[index] = USART_getchar(); // Pobranie znaku z bufora.
  32.  
  33.                 // USART_fsend(".%06X\n", bf[index]);
  34.  
  35.                 if (((bf[index] == 10) || (bf[index] == 13))) {
  36.  
  37.                     /*
  38.                      * W powyższym 'ifie' sprawdzamy czy ostatni pobrany znak jest znakiem końca linii / powrotem karetki.
  39.                      * Jeżeli nastąpił koniec linii to przekopiowujemy zawartość zmiennej lokalnej 'bf'
  40.                      *      do bufora 'buf'.
  41.                      */
  42.  
  43.                     bf[index] = 0;
  44.                     for (i = 0; i <= index; i++) {
  45.                         buf[i] = bf[i]; // Przekopiowanie całej zawartości 'bf' do 'buf'.
  46.                     }
  47.                     ret = index;
  48.                     index = 0;
  49.                     return ret; // Zwracana wartość jest równa długości odebranego strumienia.
  50.  
  51.                 } else {
  52.  
  53.                     /*
  54.                      * W przypadku, gdy ostatni pobrany znak nie jest znakiem końca linii to indeks jest zwiększany,
  55.                      *      a cały proces jest powtarzany do momentu, aż bufor się nie opróżni.
  56.                      * Jeżeli indeks osiągnął wartośc większą niż wielkość lokalnego bufora to jest on zerowany.
  57.                      */
  58.  
  59.                     index++;
  60.                     if (index >= 128)
  61.                         index = 0;
  62.                 }
  63.             // }
  64.         // }
  65.     }
  66.     return 0;
  67. }
  68.  
  69. void USART_fsend(char* format, ...) {
  70.     char tmp_rs[128] = {0};
  71.     int i;
  72.  
  73.     va_list arglist;
  74.     va_start(arglist, format);
  75.     vsprintf(tmp_rs, format, arglist);
  76.     va_end(arglist);
  77.     index_fsend = USART_TX_Empty;
  78.  
  79.     // Zmodyfikowana funkcja 'fsend', która uwzględnia mój protokół komunikacyjny.
  80.     for (i = 0; i < strlen(tmp_rs); i++) {
  81.             if (tmp_rs[i] == '.' && (tmp_rs[i+7] == 10 || tmp_rs[i+7] == 13)) {
  82.                 /*
  83.                  * W powyższym if'ie sprawdzam czy pierwszy znak jest kropką (znak początku ramki), a ostatni kończy się znakiem CR/LF.
  84.                  * W przeciwnym wypadku zaplanowane do wysłania znaki w ogóle nie lądują w buforze.
  85.                  */
  86.                 start = i + 1;
  87.                 for (int j = 0; j < 6; j++) { // Iteracja do wartości '6', ponieważ moja ramka zakłada sześć bajtów danych.
  88.                     USART_TxBuf[index_fsend] = tmp_rs[start];
  89.                     start++;
  90.                     index_fsend++;
  91.                     if (index_fsend >= USART_TxBuf_LEN)
  92.                         index_fsend = 0;
  93.                 }
  94.             }
  95.         }
  96.  
  97.     __disable_irq();
  98.  
  99.     if ((USART_TX_Empty == USART_TX_Busy) && (flag == 0)) {
  100.         /*
  101.          * Sprawdzenie czy nadawanie wciąż trwa - jeżeli transmisja trwa to powyższa linijka jest niespełniona.
  102.          * Flaga jest konieczna  - patrz: próba wysłania jednego znaku, tzn.:
  103.          *      po wysłaniu jednego znaku wskaźniki 'EMPTY' i 'BUSY' są takie same i warunek byłby spełniony.
  104.          * Jeżeli flaga == 0 -> przerwania są wyłączone i trzeba przejśc przez ciało 'ifa'.
  105.          * Jeżeli flaga == 1 -> ciało 'ifa' jest pomijane i przechodzę od razu do 'else'.
  106.          */
  107.         USART_TX_Empty = index_fsend;
  108.         uint8_t tmp = USART_TxBuf[USART_TX_Busy]; // Wrzucenie znaku do kolejki.
  109.         USART_TX_Busy++;
  110.         if(USART_TX_Busy >= USART_TxBuf_LEN) USART_TX_Busy = 0;
  111.         /*
  112.          * Oprócz przesłania znaku zostanie również włączone przerwanie od nadawania.
  113.          * Po zakończeniu transmisji wywoływany jest 'callback'.
  114.          */
  115.         HAL_UART_Transmit_IT(&huart2, &tmp, 1);
  116.         flag = 1; // Ustawienie flagi oznacza, że transmisja się rozpoczęła.
  117.     } else {
  118.         USART_TX_Empty = index_fsend;
  119.     }
  120.     __enable_irq(); // Ponownie włącza przerwania.
  121. }
  122.  
  123. void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart){
  124.     /*
  125.      * Dla wszystkich USARTów w procesorze jest wywoływany jeden callback.
  126.      * Dzięki poniższemu 'ifowi' funkcja jest wołana z adresem USARTa, do którego przyszło przerwanie.
  127.      */
  128.     if (huart == &huart2) {
  129.         if (USART_TX_Empty != USART_TX_Busy) {
  130.             uint8_t tmp = USART_TxBuf[USART_TX_Busy];
  131.             USART_TX_Busy++;
  132.             if (USART_TX_Busy >= USART_TxBuf_LEN) USART_TX_Busy = 0;
  133.             HAL_UART_Transmit_IT(&huart2, &tmp, 1); // Wołam kolejny znak, a za bitem stopu zaczyna się kolejny znak.
  134.         } else {
  135.             flag = 0; // Ustawienie flagi na 0 oznacza: 'nie mam już nic do wysłania - transmisja się zakończyła'.
  136.         }
  137.     }
  138. }
  139.  
  140. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
  141.     /*
  142.      * Gdy przerwania są odblokowane i interfejs odbierze znak to wołany jest 'callback'.
  143.      */
  144.     if (huart == &huart2) {
  145.         /*
  146.          * Jeżeli ktoś nam dopisuje coś do bufora to musimy przestawic wskaźnik 'Empty' i to oznacza, że jest już zmienna.
  147.          */
  148.         USART_RX_Empty++;
  149.         if (USART_RX_Empty >= USART_RxBuf_LEN) USART_RX_Empty = 0;
  150.         HAL_UART_Receive_IT(&huart2, &USART_RxBuf[USART_RX_Empty],1);
  151.         }
  152.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement