// //////////////////////////////////////////////////////////////////// // 全局函数:bool EndBatch() // // 返回: bool : 成功返回1,失败返回0 // 参数: 无 // 功能: // 0.数据块标识登记是否有申请? // 1.发送命令到Commbox // 2.接受结果信息 // 3.如超时接到数据,或返回错误信息 // 4.修改命令缓冲区信息 // 5.清除登记 // //////////////////////////////////////////////////////////////////// public boolean endBatch() { int times = D.REPLAYTIMES; getShared().isDoNow = true; Buffer buff = getShared().buff; byte[] cmdTemp = getShared().cmdTemp; if (buff.id == D.NULLADD) { // 数据块标识登记是否有申请? getShared().lastError = D.NOAPPLICATBUFF; return false; } if ((cmdTemp[1] & 0xFF) == 0x01) { buff.id = D.NULLADD; getShared().lastError = D.NOADDDATA; return false; } while ((times--) > 0) { try { if (times == 0) { buff.id = D.NULLADD; return false; } if (!checkIdle() || (getPort().write(getShared().cmdTemp, 0, (cmdTemp[1] & 0xFF) + 3) != (getShared().cmdTemp[1] & 0xFF) + 3)) { continue; } else if (sendOk(20 * ((cmdTemp[1] & 0xFF) + 10))) { break; } if (!stopNow(true)) { buff.id = D.NULLADD; return false; } } catch (IOException e) { continue; } } Information info = getShared().info; if (buff.id == D.LINKBLOCK) { buff.add[D.LINKBLOCK] = (byte) (info.cmdBuffLen - (cmdTemp[1] & 0xFF)); } else { buff.add[buff.id] = buff.add[D.SWAPBLOCK]; buff.used[buff.usedNum] = (byte) (buff.id); buff.usedNum++; buff.add[D.SWAPBLOCK] = (byte) ((buff.add[D.SWAPBLOCK] & 0xFF) + (cmdTemp[1] & 0xFF)); } buff.id = D.NULLADD; return true; }
// //////////////////////////////////////////////////////////////////// // 静态函数: // BYTE AddToBuff(BYTE commandword ,BYTE length,char * data) // 向已申请的新数据缓冲区块填入命令 // // 返回: 下一命令的块内地址 // 参数: commandword 操作命令字 // length 要写入数据的长度 // data 写入的数据 // 功能: // 0.数据块标识登记是否有申请? // 1.检查是否有足够的空间存储? // 2.检查命令的合法性,是否为缓冲区命令? // 3.写入命令 // 4.计算校验 // //////////////////////////////////////////////////////////////////// public boolean addToBuff(int commandWord, int offset, int count, byte... data) { byte[] cmdTemp = getShared().cmdTemp; int dataLength = cmdTemp[1] & 0xFF; int checksum = cmdTemp[dataLength + 2] & 0xFF; getShared().nextAddress = dataLength + count + 1; Buffer buffer = getShared().buff; if (buffer.id == D.NULLADD) { // 数据块标识登记是否有申请? getShared().lastError = D.NOAPPLICATBUFF; getShared().isDoNow = true; return false; } if (buffer.size() < getShared().nextAddress) { // 检查是否有足够的空间存储? getShared().lastError = D.BUFFFLOW; getShared().isDoNow = true; return false; } if (commandWord < getD().RESET && commandWord != D.CLR_LINK && commandWord != D.DO_BAT_00 && commandWord != D.D0_BAT && commandWord != D.D0_BAT_FOR && commandWord != getD().WR_DATA) { // 是否为缓冲区命令? if ((count <= D.CMD_DATALEN) || (commandWord == getD().SEND_DATA && count < D.SEND_LEN)) { // 是否合法命令? if (commandWord == getD().SEND_DATA && getBoxVer() > 0x400) { // 增加发送长命令 cmdTemp[dataLength + 2] = (byte) (D.SEND_CMD); checksum += D.SEND_CMD; dataLength++; cmdTemp[dataLength + 2] = (byte) (commandWord + count); if (count > 0) { int temp = cmdTemp[dataLength + 2] & 0xFF; cmdTemp[dataLength + 2] = (byte) (temp - 1); } checksum += cmdTemp[dataLength + 2] & 0xFF; dataLength++; for (int i = 0; i < count; i++, dataLength++) { cmdTemp[dataLength + 2] = data[i]; checksum += data[i] & 0xFF; } cmdTemp[1] = (byte) (dataLength); cmdTemp[dataLength + 2] = (byte) (checksum + count + 2); getShared().nextAddress++; } else { cmdTemp[dataLength + 2] = (byte) (commandWord + count); if (count > 0) { int temp = cmdTemp[dataLength + 2]; cmdTemp[dataLength + 2] = (byte) (temp - 1); } checksum += cmdTemp[dataLength + 2] & 0xFF; dataLength++; for (int i = 0; i < count; i++, dataLength++) { cmdTemp[dataLength + 2] = data[i]; checksum += data[i] & 0xFF; } cmdTemp[1] = (byte) (dataLength); cmdTemp[dataLength + 2] = (byte) (checksum + count + 1); getShared().nextAddress++; // Ogilvy Xu add. } return true; } getShared().lastError = D.ILLIGICAL_LEN; getShared().isDoNow = true; return false; } getShared().lastError = D.UNBUFF_CMD; getShared().isDoNow = true; return false; }