Напишите! Куда Вы денетесь?! Вот пример реализации ОВЕН-протокола для СП3хх:
В глобальный макрос:
в обычный:Код:BYTE in[64], out[16]; WORD inLen; BYTE Regs[16]; void query(BYTE *out, WORD outLen){ inLen = 0; Enter(DOWNLOAD); if(Send(DOWNLOAD, out, outLen)){ inLen = Receive(DOWNLOAD, in, 64, 500, 10); } Leave(DOWNLOAD); } WORD Owen_CRC(BYTE *buf, BYTE len){ BYTE iByte, iBit, bByte; WORD ret = 0; for(iByte = 0; iByte < len; iByte++){ bByte = buf[iByte]; for(iBit = 0; iBit < 8; iBit++){ if(((HIBYTE(ret) ^ bByte) & 0x80) > 0){ ret <<= 1; ret ^= 0x8F57; }else ret <<= 1; bByte <<= 1; } } return ret; } BYTE Owen_Query(WORD Addr, WORD Hash, BYTE Count){ BYTE UnPack[22], Pack[46], iByte; WORD CRC; UnPack[0] = HIBYTE(Addr << 5); UnPack[1] = LOBYTE(Addr << 5) | (Count > 0 ? 0x00 : 0x10) | Count; UnPack[2] = HIBYTE(Hash); UnPack[3] = LOBYTE(Hash); for(iByte = 0; iByte < Count; iByte++) UnPack[iByte+4] = out[iByte]; CRC = Owen_CRC(UnPack, Count + 4); UnPack[Count+4] = HIBYTE(CRC); UnPack[Count+5] = LOBYTE(CRC); Pack[0] = '#'; for(iByte = 0; iByte < (Count + 6); iByte++){ Pack[iByte*2+1] = ((UnPack[iByte] & 0xF0) >> 4) + 0x47; Pack[iByte*2+2] = (UnPack[iByte] & 0x0F) + 0x47; } Pack[iByte*2+1] = 0x0D; query(Pack, iByte*2+2); if(inLen > 6){ if(in[0] != 0x23 || in[inLen-1] != 0x0D || (inLen % 2) != 0) return -2; for(iByte = 0; iByte < (inLen - 2) / 2; iByte++){ UnPack[iByte] = in[iByte*2+1] - 0x47; UnPack[iByte] <<= 4; UnPack[iByte] |= in[iByte*2+2] - 0x47; } CRC = UnPack[iByte-2] << 8 | UnPack[iByte-1]; if(Owen_CRC(UnPack, iByte-2) != CRC) return -3; if(UnPack[0] != HIBYTE(Addr << 5) | (UnPack[1] & 0xE0) != LOBYTE(Addr << 5)) return -4; if((UnPack[1] & 0x10) == (Count == 0 ? 0x10: 0x00)) return -5; if(UnPack[2] == 0x02 && UnPack[3] == 0x33) return UnPack[4]; inLen = iByte - 6; for(iByte = 0; iByte < inLen; iByte++) in[iByte] = UnPack[iByte+4]; return 0; }else return -1; } float readF24(){ DWORD dw = MAKEDWORD(MAKEWORD(0, in[2]), MAKEWORD(in[1], in[0])); return DWord_2_Float(dw); } float readFloat(){ DWORD dw = MAKEDWORD(MAKEWORD(in[3], in[2]), MAKEWORD(in[1], in[0])); return DWord_2_Float(dw); } void writeFloatPSW(WORD addr, float value){ DWORD dw; dw = Float_2_DWord(value); PSW[addr] = LOWORD(dw); PSW[addr+1] = HIWORD(dw); }
Тщательно изучите и напишите свой!!!Код:if(Owen_Query(120, 0x8784, 0) == 0) writeFloatPSW(450, readF24());




Ответить с цитированием