-
Здраствйте мастера, может не совсем сюда, тк текст на c++builder
bool ReadRegister(int NetAdr,int TypeReg,int StartAdr,int Count) { if ((TypeReg!=3)&&(TypeReg!=4)||(Count>125)) { return false; } bRead=false; Byte d[8],r[255],b; DWORD wb; DWORD mask; try { d[0]=NetAdr;//Адрес d[1]=TypeReg;//Тип регистра String tmp=IntToHex(StartAdr,4);//Начальный регистр d[2]=StrToInt("0x"+tmp.SubString(1,2)); d[3]=StrToInt("0x"+tmp.SubString(3,2)); tmp=IntToHex(Count,4);//Количество регистров d[4]=StrToInt("0x"+tmp.SubString(1,2)); d[5]=StrToInt("0x"+tmp.SubString(3,2)); tmp=IntToHex(CRC16(d,6),4);//Контрольная сумма d[6]=StrToInt("0x"+tmp.SubString(3,2)); d[7]=StrToInt("0x"+tmp.SubString(1,2)); tmp=""; SetCommMask(hPort,0x0040); PurgeComm(hPort,PURGE_TXCLEAR | PURGE_RXCLEAR); Zapros="";Otvet=""; for (int e = 0; e < 8; e++) { Zapros=Zapros+IntToHex(d[e],2); } if (WriteFile(hPort,d,8,&wb,&ovr) || (GetLastError() == ERROR_IO_PENDING)){ while (!GetOverlappedResult(hPort, &ovr, &wb, FALSE)); } else{ RQueue.Error=0x15; return false; } SetCommMask(hPort,EV_RXCHAR); WaitCommEvent(hPort,&mask,&ovr); DWORD WaitReturn=WaitForSingleObject(ovr.hEvent,TimeOut); if (WaitReturn==WAIT_OBJECT_0) { DWORD rb=-1,k; do{ ReadFile(hPort,&r[++rb],1,&k,&ovr); }while (k>0); RQueue.Error=0; if (rb>0) { for (int e = 0; e < rb; e++) { Otvet=Otvet+IntToHex(r[e],2); } } if ((RQueue.NetAdr!=r[0])&&(rb>0)) RQueue.Error=0x10; if ((r[1]&0x80)&&(!RQueue.Error)) RQueue.Error=r[2]; if ((RQueue.TypeReg!=r[1])&&(rb>0)&&(!RQueue.Error)) RQueue.Error=0x10; if (((RQueue.Count*2+5)!=rb)&&(!RQueue.Error)) RQueue.Error=0x11; if ((rb!=5)&&(r[1]&0x80)) RQueue.Error=0x11; if (!RQueue.Error){ tmp=IntToHex(CRC16(r,rb-2),4); if ((StrToInt("0x"+tmp.SubString(3,2))!=r[rb-2])&&(StrToInt("0x"+tmp.SubString(1,2))!=r[rb-1]))RQueue.Error=0x13; } if (RQueue.Error) return false; for (int c = 0; c < RQueue.Count; c++) { RQueue.Value[c]=r[3+c*2]*256+r[4+c*2]; } } if (WaitReturn==WAIT_TIMEOUT) { RQueue.Error=0x12; return false; } // CloseHandle(ovr.hEvent); return true; } catch (...) { RQueue.Error=0x14; return false; }
}
Проблема такова, при первом проходе читает отлично, при втором проходе считывает первый байт при выполнении функции writefile, что это может быть и как с этим бороться? Спасибо за помощь.
|