Advertisement
Kawalek

ramka

Feb 21st, 2019
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.01 KB | None | 0 0
  1. unsigned char crc8(unsigned char poly, unsigned char* data, int size) //funkcja zajebana z gita, nie wiem dokładnie jak działa
  2. {
  3. unsigned char crc = 0x00;
  4. int bit;
  5.  
  6. while (size--) {
  7. crc ^= *data++;
  8. for (bit = 0; bit < 8; bit++) {
  9. if (crc & 0x01) {
  10. crc = (crc >> 1) ^ poly;
  11. } else {
  12. crc >>= 1;
  13. }
  14. }
  15. }
  16.  
  17. return crc;
  18. }
  19.  
  20. void checkPayload(void) { //wywołanie funkcji
  21. char tempBuffer[250];
  22. char payload[127];
  23. char escapedPayload[127];
  24. uint8_t i = 0;
  25.  
  26. while (Busy_Rx != Empty_Rx) { //tak długo jak bufor nie jest pusty dane są przepisywane do bufora tymczasowego
  27. tempBuffer[i++] = Buf_Rx[Busy_Rx++];
  28. if (Busy_Rx >= BUF_SIZE) Busy_Rx = 0;
  29. }
  30.  
  31. uint8_t j = 0;
  32. uint8_t beginDetected = 0;
  33. for(uint8_t k=0; k<i; k++){
  34. if (tempBuffer[k] == 0x21) { //jeżeli znajdzie znak początku, ustawia flagę, że znaleziono początek
  35. beginDetected = 1;
  36. j = 0;
  37. } else if (beginDetected == 1) { //jeżeli znaleziono początek ramki dane są przepisywane do bufora ramki
  38. if(j>126) { //jeżeli przekroczy zakres bufora ustawiana jest flaga że nastąpił overflow
  39. overflowWarning=1;
  40. break; //wyjście z pętli jeżeli to nastąpi, taki failsafe, żeby nie wyjebało stm'a
  41. }
  42. payload[j++] = tempBuffer[k];
  43. }
  44. }
  45. if (beginDetected != 0) { //jeżeli nie znaleziono znaku początku, szukany jest znak escape-u ramki
  46. uint8_t l = 0;
  47. uint8_t escape = 0;
  48. for(uint8_t m=0; m < j; m++){
  49. if (payload[m] == 0x7C) { //jeżeli znak jest równy znakowi escapeu ustawiana jest flaga
  50. escape = 1;
  51. } else if (escape == 0) { //jeżeli flaga escape-u nie jest znaleziona dane są normalnie przepisywane
  52. escapedPayload[l++] = payload[m];
  53. } else {//escapowanie danych
  54. escape = 0;
  55. escapedPayload[l++] = payload[m] ^ 0x20; //przy znalezionym znaku escapeu, dane są xorowane - nie wiem o co dokładnie z tym chodzi, Tokar powinien wiedziec
  56. }
  57. }
  58. if (l > 2 && l < 126) { //sprawdzanie czy ramka miesci sie w zakresie
  59. uint8_t checksum = escapedPayload[l-2]; //suma kontrolna w tym przypadku to drugi znak od końca
  60. char data[127];
  61. uint8_t n = 0;
  62. for(uint8_t o=0; o < l-2; o++){
  63. data[n++] = escapedPayload[o]; //przepisywanie danych w taki sposób, żeby nie nadpisac sumy kontrolnej
  64. }
  65. //tutaj powinien byc waruenk sprawdzający sumę crc wpisanych danych np. if(checksum==(0x42,escapedFrame,m-2)
  66. exec_command(data, n); //wywolanie funkcji wyszukującej poleceń w ramce
  67. //tutaj powinien byc komunikat w razie jakby była zła suma kontrolna np. else sendFrame("wrong checksum",14);
  68. }
  69. }
  70. }
  71. void sendPayload(uint8_t *send, uint8_t len) { //wysyłanie danych zwrotnych w ramce
  72. uint8_t payload[127];
  73. uint8_t escapedPayload[127];
  74. uint8_t i;
  75. for(i=0; i<len; i++){ //przepisanie to co ma byc wysłane
  76. payload[i] = send[i];
  77. }
  78.  
  79. payload[len] = crc8(0x42, payload, len); //wywołanie funkcji zajebanej z gita xd
  80.  
  81. uint8_t l = 1;
  82. escapedPayload[0] = 0x21;
  83. for(uint8_t m=0; m < len+1; m++){
  84. if (payload[1]==0x21 || payload[1]==0x3B || payload[1]==0x7C) { //jeżeli znak równy znakowi początku lub znakowi końca lub znakowi escape-u
  85. escapedPayload[l++] = 0x7C; //wstawianie znaku escapeu
  86. escapedPayload[l++] = payload[m] ^ 0x20; //xorowanie
  87. } else {
  88. escapedPayload[l++] = payload[m]; //w przeciwnym wypadku przepisywanie normalne danych
  89. }
  90. }
  91. escapedPayload[l] = 0x3B; //ostatni znak zawsze będzie znakiem końca ramki
  92.  
  93. uint8_t idx = Empty_Tx;
  94. for(int i = 0; i<l+1; i++){ //przepisywanie całości do bufora transmisyjnego
  95. Buf_Tx[idx] = escapedPayload[i];
  96. idx++;
  97. if (idx >250){
  98. idx = 0;
  99. }
  100. }
  101.  
  102. __disable_irq();
  103.  
  104. if (Busy_Tx == Empty_Tx && __HAL_UART_GET_FLAG(&huart2, UART_FLAG_TXE) == SET){ //przesyłanie usartem
  105. Empty_Tx = idx;
  106. temp = Buf_Tx[Busy_Tx];
  107. Busy_Tx++;
  108. if (Busy_Tx > 250){
  109. Busy_Tx = 0;
  110. }
  111. HAL_UART_Transmit_IT(&huart2, &temp, 1);
  112. } else {
  113. Empty_Tx = idx;
  114. }
  115. __enable_irq();
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement