Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Пример чтения одного параметра - текущего расхода РСТ-5 4 байта float
- */
- //---------------------------------------------------------------------------
- void __fastcall TMainForm::ButtonReadFlowClick(TObject *Sender)
- {
- try{
- ComPort->Open();
- }
- catch(...){
- MessageDlg("Ошибка открытия Com-порта", mtError, TMsgDlgButtons()<<mbOK,0);
- return;
- }
- ReadFlow(); //вызваль функцию чтения расхода
- ComPort->Close();
- }
- //--------- Чтение расхода --------------------------------------------------
- void TMainForm::ReadFlow(void)
- {
- float Flow; //переменная для читаемого расхода 4 байта float
- char Ab=1; //код абонента
- char Nb=4; //кол-во байт ответа, которые будем запрашивать
- short int Adr=0x3a8; //адрес параметра (расход)
- short int lrc; //контрольная сумма
- char cmd[32]; //строка для формирования запроса
- char BuffACK[256]; //255 max байт ответа
- cmd[0]='@'; //стартовый байт
- HexToStr(&cmd[1],(char*)&Ab,1); //cmd[1],[2] - преобразовать в строку код абонента - 1 байт
- cmd[3]='M'; //команда чтения ОЗУ
- HexToStr(&cmd[4],(char*)&Nb,1); //cmd[4],[5] - преобразовать в строку кол. запрашиваемых байт - 1 байт
- HexToStr(&cmd[6],(char*)&Adr,2); //cmd[6],[7],[8],[9] - преобразовать в строку адрес параметра в ОЗУ - 2 байта
- cmd[10]=0; //добавить конец строки для расчета lrc
- lrc=CalcLRC(cmd); //
- cmd[10]=':'; //разделитель
- HexToStr(&cmd[11],(char*)&lrc,2); //cmd[11],[12],[13],[14] - преобразовать в строку контрольную сумму - 2 байта
- cmd[15]=0x0d; //финализатор
- cmd[16]=0; //конец строки
- ComNet(cmd,BuffACK); //посылаем запрос
- StrToHex((char*)&Flow,&BuffACK[10],4); //Преобразовать строку ответа (ответ с 10-го байта) в hex и скопировать
- //по адресу переменной Float
- EditFlow->Text=FloatToStr(Flow); //вывести результат
- }//---------------------------------------------------------------------------
- int TMainForm::ComNet(char *Cmd,char *Buff)
- {
- int WriteLen,ReadLen;
- short int Nbyte; //2 байта
- WriteLen=strlen(Cmd);
- StrToHex((char*)&Nbyte,&Cmd[4],1);// Nbyte*2 должно быть в ответе;
- ReadLen=10+Nbyte*2+6;
- //10 - обязательное кол-во байт в ответе
- //Nbyte*2 - байт информации в ответе ASCII
- //6 - символ ':', lrc, код 0x0d;
- ComPort->ClearBuffer(true,true);
- ComPort->Write(Cmd,WriteLen);
- InRxChar=0;
- tick=GetTickCount();
- while(InRxChar<ReadLen){ //ждем ответа ReadLen байт
- Application->ProcessMessages();
- if((GetTickCount()-tick)>1000){
- return -1;
- }
- }
- ComPort->Read(Buff,InRxChar); //читаем что пришло
- return 0;
- }
- //---------------------------------------------------------------------------
- short int TMainForm::CalcLRC(char *cmdoka)
- {
- short int sum=0;
- while(*cmdoka){
- sum+=*cmdoka++;
- }
- return sum;
- }
- //---------------------------------------------------------------------------
- int TMainForm::StrToHex(char *ldata, char *sdata,int slen)
- {
- int i,j,k;
- for(i=0;i<slen;i++){
- *ldata=0;k=4;
- for(j=0;j<2;j++){
- if(*sdata>0x2f && *sdata<0x3a){*ldata+=(*sdata-0x30)<<k;}
- else
- if(*sdata>0x40 && *sdata<0x47){*ldata+=(*sdata-0x37)<<k;}
- else
- if(*sdata>0x60 && *sdata<0x67){*ldata+=(*sdata-0x57)<<k;}
- else{
- *sdata=0;return -1;
- }
- sdata++;k=0;
- }
- ldata++;
- }
- return 0;
- }
- //---------------------------------------------------------------------------
- void TMainForm::HexToStr(char* sdata,char* ldata,int len)
- {
- int i;
- for(i=0;i<len;i++){
- *sdata=((*ldata&0xf0)>>4)&0x0f;
- if(*sdata<10)*sdata+=0x30;
- else *sdata+=0x37;
- sdata++;
- *sdata=*ldata++&0x0f;
- if(*sdata<10)*sdata+=0x30;
- else *sdata+=0x37;
- sdata++;
- }
- *sdata++=0;
- }
- //---------------------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement