Advertisement
Guest User

Untitled

a guest
Dec 16th, 2019
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.66 KB | None | 0 0
  1. /*
  2.   Пример чтения одного параметра - текущего расхода  РСТ-5 4 байта float
  3. */
  4. //---------------------------------------------------------------------------
  5. void __fastcall TMainForm::ButtonReadFlowClick(TObject *Sender)
  6. {
  7.     try{
  8.        ComPort->Open();
  9.     }
  10.     catch(...){
  11.        MessageDlg("Ошибка открытия Com-порта", mtError, TMsgDlgButtons()<<mbOK,0);
  12.        return;
  13.     }
  14.  
  15.     ReadFlow();     //вызваль функцию чтения расхода
  16.  
  17.     ComPort->Close();
  18. }
  19. //--------- Чтение расхода --------------------------------------------------
  20. void TMainForm::ReadFlow(void)
  21. {
  22. float Flow;             //переменная для читаемого расхода 4 байта float
  23. char Ab=1;           //код абонента
  24. char Nb=4;           //кол-во байт ответа, которые будем запрашивать
  25. short int Adr=0x3a8;     //адрес параметра (расход)
  26. short int lrc;     //контрольная сумма
  27. char cmd[32];   //строка для формирования запроса
  28. char BuffACK[256];      //255 max байт ответа
  29.  
  30.  
  31.   cmd[0]='@';           //стартовый байт
  32.   HexToStr(&cmd[1],(char*)&Ab,1);      //cmd[1],[2] - преобразовать в строку код абонента - 1 байт
  33.   cmd[3]='M';           //команда чтения ОЗУ
  34.   HexToStr(&cmd[4],(char*)&Nb,1);      //cmd[4],[5] - преобразовать в строку кол. запрашиваемых байт - 1 байт
  35.   HexToStr(&cmd[6],(char*)&Adr,2);     //cmd[6],[7],[8],[9] - преобразовать в строку адрес параметра в ОЗУ - 2 байта
  36.   cmd[10]=0;            //добавить конец строки для расчета lrc
  37.   lrc=CalcLRC(cmd); //
  38.   cmd[10]=':';          //разделитель
  39.   HexToStr(&cmd[11],(char*)&lrc,2);    //cmd[11],[12],[13],[14] - преобразовать в строку контрольную сумму - 2 байта
  40.   cmd[15]=0x0d;         //финализатор
  41.   cmd[16]=0;            //конец строки
  42.  
  43.   ComNet(cmd,BuffACK);  //посылаем запрос
  44.  
  45.   StrToHex((char*)&Flow,&BuffACK[10],4);       //Преобразовать строку ответа (ответ с 10-го байта) в hex и скопировать
  46.                                                         //по адресу переменной Float
  47.   EditFlow->Text=FloatToStr(Flow);                //вывести результат
  48.  
  49. }//---------------------------------------------------------------------------
  50. int  TMainForm::ComNet(char *Cmd,char *Buff)
  51. {
  52. int WriteLen,ReadLen;
  53. short int Nbyte;    //2 байта
  54.  
  55.  WriteLen=strlen(Cmd);
  56.  
  57.  StrToHex((char*)&Nbyte,&Cmd[4],1);// Nbyte*2   должно быть в ответе;
  58.  
  59.  ReadLen=10+Nbyte*2+6;
  60.  //10 - обязательное кол-во байт в ответе
  61.  //Nbyte*2 - байт информации в ответе ASCII
  62.  //6 - символ ':', lrc, код 0x0d;
  63.  
  64.  ComPort->ClearBuffer(true,true);
  65.  ComPort->Write(Cmd,WriteLen);
  66.  InRxChar=0;
  67.  tick=GetTickCount();
  68.  while(InRxChar<ReadLen){       //ждем ответа ReadLen байт
  69.    Application->ProcessMessages();
  70.    if((GetTickCount()-tick)>1000){
  71.      return -1;
  72.    }
  73.  }
  74.  ComPort->Read(Buff,InRxChar);  //читаем что пришло
  75.  return 0;
  76. }
  77.  
  78. //---------------------------------------------------------------------------
  79. short int TMainForm::CalcLRC(char *cmdoka)
  80. {
  81. short int sum=0;
  82.  
  83.   while(*cmdoka){
  84.     sum+=*cmdoka++;
  85.   }
  86.   return sum;
  87. }
  88. //---------------------------------------------------------------------------
  89. int TMainForm::StrToHex(char *ldata, char *sdata,int slen)
  90. {
  91. int i,j,k;
  92.  
  93.  for(i=0;i<slen;i++){
  94.    *ldata=0;k=4;
  95.    for(j=0;j<2;j++){
  96.      if(*sdata>0x2f && *sdata<0x3a){*ldata+=(*sdata-0x30)<<k;}
  97.       else
  98.        if(*sdata>0x40 && *sdata<0x47){*ldata+=(*sdata-0x37)<<k;}
  99.         else
  100.          if(*sdata>0x60 && *sdata<0x67){*ldata+=(*sdata-0x57)<<k;}
  101.           else{
  102.             *sdata=0;return -1;
  103.           }
  104.      sdata++;k=0;
  105.    }
  106.    ldata++;
  107.  }
  108.  return 0;
  109. }
  110. //---------------------------------------------------------------------------
  111. void TMainForm::HexToStr(char* sdata,char* ldata,int len)
  112. {
  113. int i;
  114.  
  115.  for(i=0;i<len;i++){
  116.     *sdata=((*ldata&0xf0)>>4)&0x0f;
  117.     if(*sdata<10)*sdata+=0x30;
  118.     else *sdata+=0x37;
  119.     sdata++;
  120.     *sdata=*ldata++&0x0f;
  121.     if(*sdata<10)*sdata+=0x30;
  122.     else *sdata+=0x37;
  123.     sdata++;
  124.  }
  125.  *sdata++=0;
  126. }
  127. //---------------------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement