Advertisement
Guest User

Untitled

a guest
Apr 30th, 2017
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.81 KB | None | 0 0
  1. // ConsoleApplication1.cpp: определяет точку входа для консольного приложения.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <windows.h>
  6. #include <iostream>
  7. #include <cmath>
  8. #include <cstdlib>
  9. #include <fstream>
  10. using namespace std;
  11. HANDLE hSerial;
  12. bool connected = FALSE;
  13.  
  14.  
  15.  
  16. int to_int(char a) {
  17.     int b = a;
  18.     if (b < 0) {
  19.         b = 256 + b;
  20.     }
  21.     return b;
  22. }
  23.  
  24. int LenBin(int a) {
  25.     if (a < 2)
  26.         return 1;
  27.     else if (a < 4)
  28.         return 2;
  29.     else if (a < 8)
  30.         return 3;
  31.     else if (a < 16)
  32.         return 4;
  33.     else if (a < 32)
  34.         return 5;
  35.     else if (a < 64)
  36.         return 6;
  37.     else if (a < 128)
  38.         return 7;
  39.     else if (a < 256)
  40.         return 8;
  41.     else if (a < 512)
  42.         return 9;
  43.     else if (a < 1024)
  44.         return 10;
  45.     else if (a < 2048)
  46.         return 11;
  47.     else if (a < 4096)
  48.         return 12;
  49.     else if (a < 8192)
  50.         return 13;
  51.     else return 14;
  52. }
  53.  
  54. int division(int a, int b) {
  55.  
  56.     bool end = FALSE;
  57.     int ostatok;
  58.     int c;
  59.     int sdvig;
  60.     while (!end) {
  61.         if (LenBin(a) > LenBin(b)) {
  62.             c = b << (LenBin(a) - LenBin(b));
  63.             ostatok = a^c;
  64.             sdvig = LenBin(a) - LenBin(b);
  65.             a = ostatok;
  66.         }
  67.         else {
  68.             ostatok = a^b;
  69.         }
  70.         if (LenBin(ostatok) < LenBin(b)) {
  71.             end = TRUE;
  72.         }
  73.  
  74.     }
  75.     return ostatok;
  76. }
  77.  
  78. int decode(int vector) {
  79.     int polinom = 19;
  80.     int sindrom[15][2] = {
  81.         { 1, 1 },
  82.         { 2, 2 },
  83.         { 4, 4 },
  84.         { 8, 8 },
  85.         { 3, 16 },
  86.         { 6, 32 },
  87.         { 12, 64 },
  88.         { 11, 128 },
  89.         { 5, 256 },
  90.         { 10, 512 },
  91.         { 7, 1024 },
  92.         { 14, 2048 },
  93.         { 15, 4096 },
  94.         { 13, 8192 },
  95.         { 9, 16384 },
  96.     };
  97.     int ostatok = division(vector, polinom);
  98.     if (ostatok) {
  99.         for (int i = 0; i < 14; i++)
  100.         {
  101.             if (sindrom[i][1] == ostatok) {
  102.                 //cout << endl << sindrom[i][1];
  103.                 vector = vector^sindrom[i][2];
  104.                 vector = vector >> 4;
  105.                 return vector;
  106.             }
  107.         }
  108.         return -1;
  109.     }
  110.     else
  111.         return vector>>4;
  112. }
  113.  
  114. int encode(int vector) {
  115.  
  116.     int polinom = 19;
  117.    
  118.     int vec1 = vector << 4;
  119.     vec1 = vec1^division(vec1, polinom);
  120.     return vec1;
  121. }
  122.  
  123. void SendCOM(char b) {
  124.     DCB dcbSerialParams = { 0 };
  125.     dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
  126.     if (!GetCommState(hSerial, &dcbSerialParams))
  127.     {
  128.         cout << "getting state error\n";
  129.     }
  130.     dcbSerialParams.BaudRate = CBR_9600;
  131.     dcbSerialParams.ByteSize = 8;
  132.     dcbSerialParams.StopBits = ONESTOPBIT;
  133.     dcbSerialParams.Parity = NOPARITY;
  134.     if (!SetCommState(hSerial, &dcbSerialParams))
  135.     {
  136.         cout << "error setting serial port state\n";
  137.     }
  138.     //cout << (LPCVOID)b << endl << sizeof(b) << endl;
  139.     char data[] = {to_int(b)};
  140.     DWORD dwSize = sizeof(data);   // размер этой строки
  141.     DWORD dwBytesWritten;    // тут будет количество собственно переданных байт
  142.     BOOL iRet = WriteFile(hSerial, data, dwSize, &dwBytesWritten, NULL);
  143.     //cout << dwSize << " Bytes in string. " << dwBytesWritten << " Bytes sended. " << endl;
  144.    
  145. }
  146.  
  147. void SpecialFrame(int a) {
  148.     SendCOM(char(255));
  149.     SendCOM(char(a));
  150.     SendCOM(char(255));
  151. }
  152.  
  153. void frame_prepare(int vectors[], int count) {
  154.     if (count < 254) {
  155.         SendCOM(char(255));
  156.         SendCOM(char(7));
  157.         SendCOM(char(1));
  158.         SendCOM(char(count));
  159.         for (int i = 1; i < count+1; i++) {
  160.             SendCOM(char((vectors[i - 1] & 32512)>>8));
  161.             SendCOM(char(vectors[i - 1] & 255));
  162.         }
  163.         SendCOM(char(255));
  164.     }
  165.     else {
  166.         int c = 1;
  167.         double e = (double)count / 254;
  168.         while (c <= ceil(e)) {
  169.             SendCOM(char(255));
  170.             SendCOM(char(7));
  171.             SendCOM(char(c));
  172.             int cnt;
  173.             if (count - (c-1) * 254 > 254) {
  174.                 cnt = 254;
  175.                
  176.             }
  177.             else {
  178.                 cnt = count - 254 * (c - 1);
  179.             }
  180.             SendCOM(char(cnt));
  181.             int a;
  182.             for (int i = 1; i < cnt + 1; i++) {
  183.                 SendCOM(char((vectors[255*(c-1)+i - 1] & 32512) >> 8));
  184.                 SendCOM(char(vectors[255*(c-1)+i - 1] & 255));
  185.             }
  186.             SendCOM(char(255));
  187.             c++;
  188.         }
  189.     }
  190. }
  191.  
  192. void get(int bytes[], int count) {
  193.    
  194.     int *byt = new int[count];
  195.     for (int i = 0; i < count; i++) {
  196.         byt[i] = encode(bytes[i]);
  197.     }
  198.     frame_prepare(byt, count);
  199. }
  200.  
  201. void frame_release(int vectors[],int count) {
  202.     if (count) {
  203.         int i = 0;
  204.         int vector[255];
  205.         while (i<count * 2) {
  206.             vector[i / 2] = decode((vectors[i] << 8) + vectors[i + 1]);
  207.             cout << char(vector[i / 2]);
  208.             i += 2;
  209.         }
  210.         int a = 0;
  211.     }
  212.     else {
  213.         switch (vectors[0]) {
  214.             case 0:
  215.                 cout << "Request";
  216.                 break;
  217.             case 1:
  218.                 cout << "Success";
  219.                 break;
  220.             case 2:
  221.                 cout << "Break";
  222.                 break;
  223.             case 3:
  224.                 cout << "Allow";
  225.                 break;
  226.             case 4:
  227.                 cout << "Deny";
  228.                 break;
  229.         }
  230.         //TO DO Денис, а здесь ты будешь обрабатывать различную хрень типо Запроса соединения и прочего
  231.     }
  232.     int a = 0;
  233.     //TO DO Денис, Здесь ты должен вызвать свою функцию, которая будет принимать от меня кадры
  234. }
  235.  
  236. void ReadCOM()
  237. {
  238.     DWORD iSize;
  239.     char sReceivedChar;
  240.     bool frame = FALSE;
  241.     bool data = FALSE;
  242.     int type = 0;
  243.     int counter = 0;
  244.     int length = 0;
  245.     int data_count = 0;
  246.     int data1[510];
  247.     int i = 0;
  248.     while (true)
  249.     {
  250.         ReadFile(hSerial, &sReceivedChar, 1, &iSize, 0);  // получаем 1 байт
  251.         if (iSize > 0) {    // если что-то принято, выводим
  252.             int byte = to_int(sReceivedChar);
  253.             if (frame & !data & byte!=255) {
  254.                 if (!type) {
  255.                     type = byte;
  256.                     if (type != 7) {
  257.                         counter = 1;
  258.                         length = 1;
  259.                     }
  260.                 }
  261.                 else if (!counter) {
  262.                     counter = byte;
  263.                 }
  264.                 else if (!length) {
  265.                     length = byte;
  266.                     data = TRUE;
  267.                 }
  268.             }
  269.             else if (data) {
  270.                 if (i < length * 2) {
  271.                     data1[i] = byte;
  272.                     i++;
  273.                 }
  274.                 else {
  275.                     data = FALSE;
  276.                     if (byte == 255) {
  277.                         frame_release(data1, length);
  278.                         i = 0;
  279.                         type = 0;
  280.                         counter = 0;
  281.                         length = 0;
  282.                         data_count = 0;
  283.                         for (int c = 0; c < length * 2; c++) {
  284.                             data1[c] = 0;
  285.                         }
  286.                         frame = FALSE;
  287.                     }
  288.                 }              
  289.             }
  290.             else if (byte == 255) {
  291.                 if (!frame & !data) {
  292.                     frame = TRUE;
  293.                 }
  294.                 else if (frame & !data) {
  295.                
  296.                     if (type == 7) {
  297.                         frame_release(data1, length);
  298.                     }
  299.                     else {
  300.                         int cadr[1];
  301.                         cadr[0] = type;
  302.                         frame_release(cadr, 0);
  303.                     }
  304.                     i = 0;
  305.                     type = 0;
  306.                     counter = 0;
  307.                     length = 0;
  308.                     data_count = 0;
  309.                     for (int c = 0; c < length * 2; c++) {
  310.                         data1[c] = 0;
  311.                     }
  312.                     frame = FALSE;
  313.                 }
  314.             }
  315.  
  316.         }
  317.     }
  318. }
  319.  
  320.  
  321. int _tmain(int argc, _TCHAR* argv[])
  322. {
  323.     char* sPortName;
  324.     sPortName = new char[6];
  325.     cin >> sPortName;
  326.     hSerial = ::CreateFile(sPortName, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  327.     if (hSerial == INVALID_HANDLE_VALUE)
  328.         {
  329.             if (GetLastError() == ERROR_FILE_NOT_FOUND)
  330.             {
  331.                 cout << "serial port does not exist.\n";
  332.             }
  333.             cout << "some other error occurred.\n";
  334.  
  335.            
  336.         }
  337.     while (1)
  338.     {
  339.         ReadCOM();
  340.     }
  341.    
  342.     return 0;
  343. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement