Example #1
0
void RobotOpenClass::parsePacket() {
    /* ---PACKET FORMAT---
     * Message Type (1 byte)
     * Protocol Version (1 byte)
     * Device ID (1 byte)
     * ...Bundle Payloads... (1 length byte + 1 identifier byte + payload)
     * CRC16 Checksum (2 bytes)
     */
    
    unsigned int crc16_recv = (_packetBufferAccessor[_packetBufferSize - 2] << 8) | _packetBufferAccessor[_packetBufferSize - 1];
    if (_packetBufferAccessor[1] == PROTOCOL_VER && calc_crc16(_packetBufferAccessor, _packetBufferSize - 2) == crc16_recv) {
		// VALID PACKET
        if (_packetBufferAccessor[0] == CONTROL_PACKET && _packetBufferSize > 5) {
            swapValidPacket();	// This swaps the buffer and the "active" packet data pointers
			// Update the PWM generator values over serial
			unsigned int crc16_pwm = calc_crc16(_pwmSerialData, 12);
	        _pwmSerialData[12] = crc16_pwm >> 8;
	        _pwmSerialData[13] = (unsigned char)(crc16_pwm & 0xFF);
			for (int i = 0; i <= 13; i++)
				Serial.write(_pwmSerialData[i]);
			// Update the Relay values over serial
			unsigned int crc16_relay = calc_crc16(_relaySerialData, 12) + 1;
	        _relaySerialData[12] = crc16_relay >> 8;
	        _relaySerialData[13] = (unsigned char)(crc16_relay & 0xFF);
			for (int i = 0; i <= 13; i++)
				Serial.write(_relaySerialData[i]);
			// Make sure the system stays active
            _lastUpdate = millis();
        }
        publishDS();
    }
Example #2
0
int8_t uart_rx_frame(uint8_t *pdata)
{
#ifdef CONFIG_LINKLAY_UART
    uint8_t i, rlen = 0;
    uint8_t *pbuf;
    uint16_t crc;
    if (0 == uart[CONFIG_LINKLAY_UART].RxEN)
    {
        uart[CONFIG_LINKLAY_UART].RxEN = 1;
    }
    if (uart_recv[CONFIG_LINKLAY_UART].rx_finish == 0)
    {
        return 0;
    }
    rlen = uart_recv[CONFIG_LINKLAY_UART].rx_Len-3;
    pbuf = &uart_recv[CONFIG_LINKLAY_UART].rx_buf[0];
    crc = calc_crc16(pbuf[3], 0xffff);
    for (i = 1; i< rlen; i++) {
        crc = calc_crc16(pbuf[i+3], crc);
    }
    uart_recv[CONFIG_LINKLAY_UART].rx_finish = 0;
    if (crc != pbuf[1]*256 + pbuf[2]) {
        return -1;
    }

    MMemcpy(pdata,&pbuf[3],rlen);
    return rlen;
#else
    return 0;
#endif
}
Example #3
0
SSRecord::SSRecord (SSFileImpPtr filePtr, long offset)
  : m_FileImpPtr (filePtr), m_Offset(offset), m_pBuffer(NULL), m_Len (0)
{
  int fileLength = m_FileImpPtr->Size ();

  if (!m_FileImpPtr->Read (offset, &m_Header, sizeof(m_Header)))
    throw SSException ("could not read record header");

  // OPTIMIZE: We do not nead to read all the record payload in advance (esp. for FD records)
  if (m_Header.size > 0)
  {
    if (offset + sizeof(m_Header) + m_Header.size > fileLength)
      throw SSRecordException ("bad header: length variable exceeds file size");

    m_pBuffer = new byte[m_Header.size];
    if (!m_FileImpPtr->Read (/*offset + sizeof(m_Header), */ m_pBuffer, m_Header.size))
      throw SSException ("could not read record data");

    short crc = calc_crc16 (m_pBuffer, m_Header.size);
    if (m_Header.checksum != (short)crc && m_Header.checksum != 0)
    {
      SSRecordException ex("wrong checksum");
      Warning (ex.what());
      _RAISE (ex);
    }
  }
  
  m_Len = m_Header.size;
}
Example #4
0
int _stdcall MakeBuf_SetRegNo(TSDeviceInfo *pDevice, TSCmdBuffer *pBuffer,unsigned char *regno)
{
	unsigned char ucCommandByte,ucRegNo[4],out[3];
	int           addr,len;
	if(pDevice->nHardware != 5301)
		ucCommandByte = CMD_SETREGNO_TERMINAL;
	else
		ucCommandByte = CMD_SETREGNO_NET;
	addr          = pDevice->nAddr;
	len           = 8;
	SVC_DSP_2_HEX((unsigned char *)pDevice->sRegNo,ucRegNo,4);
	memcpy(pBuffer->pBuffer,ucRegNo,4);
	memcpy(&pBuffer->pBuffer[4],regno,4);
	pBuffer->nCmdSize = PubCommands(addr,ucCommandByte,len,pBuffer->pBuffer,pDevice->nLevel,pDevice->sLevelArray);
	if(pDevice->nHardware != 5301)
	{
		pBuffer->pBuffer[2] = CMD_SETREGNO_TERMINAL;
		calc_crc16(pBuffer->nCmdSize-3,pBuffer->pBuffer,out);
		pBuffer->pBuffer[pBuffer->nCmdSize-3] = out[0];
		pBuffer->pBuffer[pBuffer->nCmdSize-2] = out[1];
	}
	pBuffer->nTimeOut1 = 50;
	pBuffer->nTimeOut1 = 1000;
	return RET_OK;
}
Example #5
0
///////////////////////////////////////////////////////////////////////////////////////////
/// 功    能: -- 收到包的一部分后对其进行校验, 检测是否合法。
/// 参    数: 
///        pBuffer     --  要校验的数据块
///        nBufferSize --  数据块长度
///
/// 返 回 值: 
///        见返回值定义
///
/// 说    明:
///        只检验协议的正确性,如包的数据长度, CRC等错误
///////////////////////////////////////////////////////////////////////////////////////////
int VerifyBufferValid(unsigned char *pBuffer, int nBufferSize)
{
	unsigned char out[3];
	int           flag;
	flag = calc_crc16((unsigned char)nBufferSize,pBuffer,out);
	if(flag == 1)
		return  RET_OK;
	else
		return RET_DATACRC_ERROR;
}
Example #6
0
void check_fval(int fd, mkv_t *kv)
{
    uint16_t crc = calc_crc16(kv->v.data, kv->v.len);
    if (kv->vcrc != crc) {
        char fp[256];
        get_fname(fd, fp, sizeof(fp));
        FATAL("%s corrupt!!", fp);
        ASSERT(kv->vcrc == crc);
    }
}
//CRC检测
bool COperator::CRCValid(BYTE *pszByte, int nPos)
{
	unsigned char out[3];
	calc_crc16(nPos, pszByte, out);
	if( pszByte[nPos] == out[0] && pszByte[nPos+1] == out[1] )
		return true;
	else
	{
		OnCRCError();
		return false;
	}
}
Example #8
0
uint8_t uart_send_frame(uint8_t *pdata, uint8_t len)
{
#ifdef CONFIG_LINKLAY_UART

    uint16_t crc;
    uint8_t i;

    crc = calc_crc16(pdata[0], 0xFFFF);
    for (i = 1; i < len; i++) {
        crc = calc_crc16(pdata[i], crc);
    }
    UART_CHAR_SEND(CONFIG_LINKLAY_UART, 0xaa);
    UART_CHAR_SEND(CONFIG_LINKLAY_UART, len+4);// 0xaa len crc[0] crc[1]
    UART_CHAR_SEND(CONFIG_LINKLAY_UART, crc>>8);
    UART_CHAR_SEND(CONFIG_LINKLAY_UART, crc%256);

    uart_tx_bytes(pdata, len);

    return len;
#else
    return 0;
#endif
}
Example #9
0
SSRecord::SSRecord (eType type, const void* buffer, int len)
  : m_Offset(0), m_pBuffer(NULL), m_Len (0)
{
  m_Header.checksum = calc_crc16 (buffer, len);
  strncpy (m_Header.type, TypeToString (type).c_str(), 2);
  m_Header.size = len;

  // OPTIMIZE: We do not nead to read all the record payload in advance (esp. for FD records)
  if (m_Header.size > 0)
  {
    m_pBuffer = new byte[m_Header.size];
    memcpy (m_pBuffer, buffer, m_Header.size);
  }
  
  m_Len = m_Header.size;
}
Example #10
0
/// 功能:下传补助名单
/// 参数:*List
///       3字节交易卡号
///       2字节批号
///       2字节金额(低位在前)
///       1字节加减钱标记(0---加,1---减)
/// Ver:1.0 ------ 20040228
/// Auth:Lina
int _stdcall MakeBuf_SetAssisList(TSDeviceInfo *pDevice,TSCmdBuffer *pBuffer,unsigned char *Buffer)
{
	unsigned char ucCommandByte,out[3];
	int           addr,len;
	ucCommandByte = CMD_SETASSISTLIST;
	addr          = pDevice->nAddr;
	len           = 10;
	calc_crc16(8,Buffer,out);
	memcpy(pBuffer->pBuffer,Buffer,8);
	pBuffer->pBuffer[8] = out[0];
	pBuffer->pBuffer[9] = out[1];
	pBuffer->nCmdSize = PubCommands(addr,ucCommandByte,len,pBuffer->pBuffer,pDevice->nLevel,pDevice->sLevelArray);
	pBuffer->nTimeOut1 = 50;
	pBuffer->nTimeOut1 = 1000;
	return RET_OK;
}
Example #11
0
/// 功能:下传白名单版本4
/// 参数:*date ---- 六子节黑名单版本4
/// Ver: 1.0 ------- 20040227
/// Auth:Lina
int _stdcall MakeBuf_SetWhiteVersion4(TSDeviceInfo *pDevice,TSCmdBuffer *pBuffer,unsigned char *date)
{
	unsigned char ucRegNo[4],ucCommandByte;
	int           addr,len;
	ucCommandByte = CMD_SETWHITE_VERSION4;
	addr          = pDevice->nAddr;
	len           = 16;
	unsigned char out[5];

	SVC_DSP_2_HEX((unsigned char *)pDevice->sRegNo,ucRegNo,4);

	memcpy(pBuffer->pBuffer,ucRegNo,4);
	memcpy(&pBuffer->pBuffer[4],date,10);

	calc_crc16(14,pBuffer->pBuffer,out);
	pBuffer->pBuffer[14] = out[0];
	pBuffer->pBuffer[15] = out[1];

	pBuffer->nCmdSize = PubCommands(addr,ucCommandByte,len,pBuffer->pBuffer,pDevice->nLevel,pDevice->sLevelArray);
	pBuffer->nTimeOut1 = 200;
	pBuffer->nTimeOut1 = 1000;
	return RET_OK;
}
Example #12
0
/* Recupere les bytes pour composer le crc et le retourne */
unsigned int crc16_protocole(TrameProtocole trame)
{
  byte buff[trame.length + 5];
  getBytesCrc(trame,buff);
  return calc_crc16(buff,trame.length + 5);
}
//收集扎帐历史数据
void CollectHistoryCheckInData_Process(TSSmartDoc *pDoc,TSSmartBuffer *pBuffer)
{
	int           crcFlag;
	unsigned char ucNo,out[3],ucAddr,ucFlowNo[2];
	char          cTemp[256];
	CTime tm=CTime::GetCurrentTime();
	FILE  *fp;
	char  filename[512],temp[512];
	WORD  wFlowNo,wFlow1;
	ucNo = pDoc->m_ucNo;

	if(pBuffer->ucMode == 2) //有数据返回
	{
		if(pDoc->m_wNoReponseTime != 0) //由不通讯到通讯,在规定的次数内应发出通讯成功信息
		{
			pDoc->m_wNoReponseTime = 0; //本部分目前缺少代码
		}
		crcFlag = calc_crc16((unsigned char)(pBuffer->wLength),pBuffer->ucBuffer,out);
		if(crcFlag == 1)//CRC正确
		{
			ucAddr = pBuffer->ucBuffer[1];
			if(ucAddr == pDoc->m_TerminalInfo[ucNo].ucMacNo) //返回数据体机号相符合
			{
				if(pBuffer->ucBuffer[2] == 0) //正确
				{
					GetCurrentDirectory(512,temp);
					sprintf(filename,"%s\\log\\No%.2X%.2X%.2X%.2X_%.2d%.2d%.2d扎帐历史数据.txt",temp,	
					pDoc->m_TerminalInfo[ucNo].ucIDNo[0],pDoc->m_TerminalInfo[ucNo].ucIDNo[1],
					pDoc->m_TerminalInfo[ucNo].ucIDNo[2],pDoc->m_TerminalInfo[ucNo].ucIDNo[3],
					tm.GetYear(),tm.GetMonth(),tm.GetDay());
					fp = fopen(filename,"a+");
					sprintf(temp,"%.2d年%.2d月%.2d日 %.2d时%.2d分%.2d秒收集扎帐历史数据\n",	tm.GetYear(),tm.GetMonth(),tm.GetDay(),tm.GetHour(),tm.GetMinute(),tm.GetSecond());
					fputs(temp,fp);
					sprintf(temp,"注册号          0x%.2X%.2X%.2X%.2X\n",pBuffer->ucBuffer[4],pBuffer->ucBuffer[5],pBuffer->ucBuffer[6],pBuffer->ucBuffer[7]);fputs(temp,fp);
					sprintf(temp,"通信版本        0x%.2X\n",pBuffer->ucBuffer[8]);fputs(temp,fp);
					sprintf(temp,"启动原因        0x%.2X\n",pBuffer->ucBuffer[9]);fputs(temp,fp);
					sprintf(temp,"扎帐流水        %d\n",  pBuffer->ucBuffer[10]*256+pBuffer->ucBuffer[11]);fputs(temp,fp);
					sprintf(temp,"扎帐时间        %.2d%.2d%.2d-%.2d%.2d%.2d\n",pBuffer->ucBuffer[12],pBuffer->ucBuffer[13],
						                                                       pBuffer->ucBuffer[14],pBuffer->ucBuffer[15],
																			   pBuffer->ucBuffer[16],pBuffer->ucBuffer[17]);
					fputs(temp,fp);
					sprintf(temp,"起始流水号      %d\n",pBuffer->ucBuffer[18]*256+pBuffer->ucBuffer[19]);fputs(temp,fp);
					sprintf(temp,"结束流水号      %d\n",pBuffer->ucBuffer[20]*256+pBuffer->ucBuffer[21]);fputs(temp,fp);
					sprintf(temp,"正常消费总笔数 %d\n",pBuffer->ucBuffer[22]*256+pBuffer->ucBuffer[23]);fputs(temp,fp);
					sprintf(temp,"正常消费总金额  %d\n",pBuffer->ucBuffer[24]+pBuffer->ucBuffer[25]*256+pBuffer->ucBuffer[26]*65536);fputs(temp,fp);
					sprintf(temp,"冲正消费总笔数 %d\n",pBuffer->ucBuffer[27]*256+pBuffer->ucBuffer[28]);fputs(temp,fp);
					sprintf(temp,"冲正消费总金额 %d\n",pBuffer->ucBuffer[29]+pBuffer->ucBuffer[30]*256+pBuffer->ucBuffer[31]*65536);fputs(temp,fp);
					sprintf(temp,"异常消费总笔数 %d\n",pBuffer->ucBuffer[32]*256+pBuffer->ucBuffer[33]);fputs(temp,fp);
					sprintf(temp,"异常消费总金额 %d\n",pBuffer->ucBuffer[34]+pBuffer->ucBuffer[35]*256+pBuffer->ucBuffer[36]*65536);fputs(temp,fp);	
					sprintf(temp,"其他交易总笔数  %d\n",pBuffer->ucBuffer[37]*256+pBuffer->ucBuffer[38]);fputs(temp,fp);
					sprintf(temp,"扎帐标记     0x%.2X\n",pBuffer->ucBuffer[39]);fputs(temp,fp);
					sprintf(temp,"CRC=%.2X%.2X",pBuffer->ucBuffer[40],pBuffer->ucBuffer[41]); fputs(temp,fp);
					crcFlag = calc_crc16(38,&(pBuffer->ucBuffer[4]),out);
					if(crcFlag == 0)
						fputs("正确\n",fp);
					else
						fputs("错误\n",fp);
					fclose(fp);
					wFlowNo =  pBuffer->ucBuffer[10]*256+pBuffer->ucBuffer[11];
					pDoc->m_TerminalInfo[ucNo].wECFlowNo = wFlowNo; 
					pDoc->m_TaskInfo.wTaskCurrentNo += 1;
					
					if(pDoc->m_TaskInfo.wTaskCurrentNo == pDoc->m_TaskInfo.wTaskTotalNo) //历史数据收集完成
					{
						if(pDoc->m_bNetPar == true) //星型结构
						{
							pDoc->m_ucNo            = 0;
							pDoc->m_TaskInfo.wIDNo  = 0; //任务ID为0 
							pDoc->m_TaskInfo.ucMode = 0; //默认任务
							pDoc->m_TaskInfo.wTaskTotalNo = 0;
							pDoc->m_TaskInfo.wTaskCurrentNo =0;
							pDoc->m_TaskInfo.ucCommandTotalNo = 1;
							pDoc->m_TaskInfo.ucCommandCurrentNo = 0;
							pDoc->m_TaskInfo.ucCommandArray[0] = 0x03;
							pDoc->m_TaskInfo.ucERetryNo = 3;//命令字期望重试次数
							pDoc->m_TaskInfo.ucRetryNo  = 0;
							BuildTaskBuffer(pDoc,pBuffer,ucFlowNo,0);
							//AfxMessageBox("收集交易数据");
							return;
						}
					}
					else//历史数据收集未完成
					{
						//pDoc->m_ucNo = PortNo; //当前操作端口
						pDoc->m_TaskInfo.wIDNo = 2; //任务ID
						pDoc->m_TaskInfo.ucMode = 1; //计次任务
						//pDoc->m_TaskInfo.wTaskTotalNo = wFlowNo-pDoc->m_TerminalInfo[PortNo].wEDFlowNo; //期望运行总次数
						//		pDoc->m_TaskInfo.wTaskCurrentNo = 0; //当前次数为0
						pDoc->m_TaskInfo.ucCommandTotalNo = 1;//命令总次数
						pDoc->m_TaskInfo.ucCommandCurrentNo = 0;//命令字当前数 
						pDoc->m_TaskInfo.ucCommandArray[0]  = 0x8A; //收集历史数据
						pDoc->m_TaskInfo.ucERetryNo = 3;//命令字期望重试次数
						pDoc->m_TaskInfo.ucRetryNo  = 0;
						if(wFlowNo == 0xFFFF)
							wFlow1 = 0;
						else
							wFlow1 = wFlowNo+1;
						sprintf(temp,"收集历史数据---%d",wFlow1);
						//AfxMessageBox(temp);
						ucFlowNo[0] = (unsigned char)(wFlow1 / 256);
						ucFlowNo[1] = (unsigned char)(wFlow1 % 256);
						BuildTaskBuffer(pDoc,pBuffer,ucFlowNo,2);
					}
		

				}
				else
				{
					sprintf(cTemp,"收集扎帐数据---返回数据体Mark值%.2X",pBuffer->ucBuffer[2]);
					AfxMessageBox(cTemp);
					return;
				}
			}
			else //返回数据体机号不符合
			{
				sprintf(cTemp,"收集扎帐数据 ---- 返回数据体机号不符合 = %d",ucAddr);
				AfxMessageBox(cTemp);
				return;
			}
		}
		else //CRC不正确
		{
			AfxMessageBox("返回数据体CRC错误");
			return;
		}
	}
}
//写收费机交易数据
void Write_SFJData_Process(TSSmartDoc *pDoc,TSSmartBuffer *pBuffer,unsigned char *Buffer)
{
	unsigned char ucFlowNo[2],out[3];
	CTime tm=CTime::GetCurrentTime();
	FILE  *fp;
	char  filename[512],temp[512];
	int   crcFlag,PortNo;
	WORD  wFlowNo,wFlow1;
	
	PortNo = pDoc->m_ucNo;
	GetCurrentDirectory(512,temp);
	sprintf(filename,"%s\\log\\No%.2X%.2X%.2X%.2X_%.2d%.2d%.2d历史交易数据.txt",temp,	
		pDoc->m_TerminalInfo[PortNo].ucIDNo[0],pDoc->m_TerminalInfo[PortNo].ucIDNo[1],
		pDoc->m_TerminalInfo[PortNo].ucIDNo[2],pDoc->m_TerminalInfo[PortNo].ucIDNo[3],
		tm.GetYear(),tm.GetMonth(),tm.GetDay());
	fp = fopen(filename,"a+");
	sprintf(temp,"%.2d年%.2d月%.2d日 %.2d时%.2d分%.2d秒收集历史交易数据\n",	tm.GetYear(),tm.GetMonth(),tm.GetDay(),tm.GetHour(),tm.GetMinute(),tm.GetSecond());
	fputs(temp,fp);
	sprintf(temp,"注册号   %.2X%.2X%.2X%.2X\n", Buffer[0],Buffer[1],Buffer[2],Buffer[3]);	fputs(temp,fp);	
	sprintf(temp,"通信版本 %.2X\n",Buffer[4]);												fputs(temp,fp);
	sprintf(temp,"启动原因 %.2X\n",Buffer[5]);												fputs(temp,fp);
	sprintf(temp,"交易流水 %d\n",  Buffer[6]*256+Buffer[7]);								fputs(temp,fp);
	sprintf(temp,"交易卡号 %.10d\n",Buffer[8]*65536+Buffer[9]*256+Buffer[10]);				fputs(temp,fp);
	sprintf(temp,"交易时间 %.2d%.2d%.2d-%.2d%.2d%.2d\n",Buffer[11],Buffer[12],Buffer[13],
														Buffer[14],Buffer[15],Buffer[16]);	fputs(temp,fp);
	sprintf(temp,"卡片累计使用次数 %d\n",Buffer[17]*256+Buffer[18]);						fputs(temp,fp);
	sprintf(temp,"入卡金额 %d分\n",	Buffer[19]+Buffer[20]*256+Buffer[21]*65536);			fputs(temp,fp);
	sprintf(temp,"出卡金额 %d分\n", Buffer[22]+Buffer[23]*256+Buffer[24]*65536);			fputs(temp,fp);
	sprintf(temp,"交易标记 %.2X\n", Buffer[25]);											fputs(temp,fp);
	sprintf(temp,"CRC=%.2X%.2X ",   Buffer[26],Buffer[27]);									fputs(temp,fp);
	
	wFlowNo = (WORD)(Buffer[6]*256)+Buffer[7];
	
	crcFlag = calc_crc16(28,Buffer,out);
	if(crcFlag == 0)
		sprintf(temp,"%s","正确\n");
	else
		sprintf(temp,"%s","错误\n");
	fputs(temp,fp);
	fclose(fp);
	
	pDoc->m_TaskInfo.wTaskCurrentNo += 1;
	pDoc->m_TerminalInfo[PortNo].wEDFlowNo = wFlowNo; 
	if(pDoc->m_TaskInfo.wTaskCurrentNo == pDoc->m_TaskInfo.wTaskTotalNo) //历史数据收集完成
	{
		if(pDoc->m_bNetPar == true) //星型结构
		{
			pDoc->m_ucNo            = 0;
			pDoc->m_TaskInfo.wIDNo  = 0; //任务ID为0 
			pDoc->m_TaskInfo.ucMode = 0; //默认任务
			pDoc->m_TaskInfo.wTaskTotalNo = 0;
			pDoc->m_TaskInfo.wTaskCurrentNo =0;
			pDoc->m_TaskInfo.ucCommandTotalNo = 1;
			pDoc->m_TaskInfo.ucCommandCurrentNo = 0;
			pDoc->m_TaskInfo.ucCommandArray[0] = 0x03;
			pDoc->m_TaskInfo.ucERetryNo = 3;//命令字期望重试次数
			pDoc->m_TaskInfo.ucRetryNo  = 0;
			BuildTaskBuffer(pDoc,pBuffer,ucFlowNo,0);
			//AfxMessageBox("收集交易数据");
			return;
		}
	}
	else//历史数据收集未完成
	{
		pDoc->m_ucNo = PortNo; //当前操作端口
		pDoc->m_TaskInfo.wIDNo = 1; //任务ID
		pDoc->m_TaskInfo.ucMode = 1; //计次任务
		//pDoc->m_TaskInfo.wTaskTotalNo = wFlowNo-pDoc->m_TerminalInfo[PortNo].wEDFlowNo; //期望运行总次数
//		pDoc->m_TaskInfo.wTaskCurrentNo = 0; //当前次数为0
		pDoc->m_TaskInfo.ucCommandTotalNo = 1;//命令总次数
		pDoc->m_TaskInfo.ucCommandCurrentNo = 0;//命令字当前数 
		pDoc->m_TaskInfo.ucCommandArray[0]  = 0xBB; //收集历史数据
		pDoc->m_TaskInfo.ucERetryNo = 3;//命令字期望重试次数
		pDoc->m_TaskInfo.ucRetryNo  = 0;
		if(wFlowNo == 0xFFFF)
			wFlow1 = 0;
		else
			wFlow1 = wFlowNo+1;
		//sprintf(temp,"收集历史数据---%d",wFlow1);
		//AfxMessageBox(temp);
		ucFlowNo[0] = (unsigned char)(wFlow1 / 256);
		ucFlowNo[1] = (unsigned char)(wFlow1 % 256);
		BuildTaskBuffer(pDoc,pBuffer,ucFlowNo,2);
	}
		
	return;
}
//收集历史数据流程
void CollectHistoryDealData_Process(TSSmartDoc *pDoc,TSSmartBuffer *pBuffer)
{
	int crcFlag;
	unsigned char ucNo,out[3],ucAddr;
	ucNo = pDoc->m_ucNo;
	if(pBuffer->ucMode == 2) //有数据返回
	{
		if(pDoc->m_wNoReponseTime != 0) //由不通讯到通讯,在规定的次数内应发出通讯成功信息
		{
			pDoc->m_wNoReponseTime = 0; //本部分目前缺少代码
		}
		crcFlag = calc_crc16((unsigned char)(pBuffer->wLength),pBuffer->ucBuffer,out);
		if(crcFlag == 1)//CRC正确
		{
			ucAddr = pBuffer->ucBuffer[1];
			if(ucAddr == pDoc->m_TerminalInfo[ucNo].ucMacNo) //返回数据体机号相符合
			{
				if(pBuffer->ucBuffer[2] == 0) //正确
					Process_HistoryData(pDoc,pBuffer);
				else //错误待处理
				{
				}
				return;
			}
			else //机号不对处理流程
			{
				pDoc->m_ucNo = 0;
				pDoc->m_TaskInfo.ucMode = 0;//默认任务
				pDoc->m_TaskInfo.wIDNo  = 0;//任务ID号,0----代表数据收集与确认
				pDoc->m_TaskInfo.ucERetryNo = 3;//期望重试次数为3
				pDoc->m_TaskInfo.ucRetryNo  = 0;//当前命令重试次数 
				pDoc->m_TaskInfo.ucCommandTotalNo = 1;//命令字总数为1
				pDoc->m_TaskInfo.ucCommandCurrentNo = 0;//命令字当前运行序号
				pDoc->m_TaskInfo.ucCommandArray[0] = 0x03;
				BuildTaskBuffer(pDoc,pBuffer,out,0);
				return;
			}
		}
		else//接收数据包CRC不对处理流程
		{
			pDoc->m_ucNo = 0;
			pDoc->m_TaskInfo.ucMode = 0;//默认任务
			pDoc->m_TaskInfo.wIDNo  = 0;//任务ID号,0----代表数据收集与确认
			pDoc->m_TaskInfo.ucERetryNo = 3;//期望重试次数为3
			pDoc->m_TaskInfo.ucRetryNo  = 0;//当前命令重试次数 
			pDoc->m_TaskInfo.ucCommandTotalNo = 1;//命令字总数为1
			pDoc->m_TaskInfo.ucCommandCurrentNo = 0;//命令字当前运行序号
			pDoc->m_TaskInfo.ucCommandArray[0] = 0x03;
			BuildTaskBuffer(pDoc,pBuffer,out,0);
			return;
		}
		return;
	}
	else //未接到数据
	{
		pDoc->m_TaskInfo.ucRetryNo++;
		if(pDoc->m_TaskInfo.ucRetryNo == pDoc->m_TaskInfo.ucERetryNo) //重试次数到
		{
			if(pDoc->m_bNetPar == true) //星型结构
			{
				pDoc->m_ucNo = 0;
				pDoc->m_TaskInfo.ucMode = 0;//默认任务
				pDoc->m_TaskInfo.wIDNo  = 0;//任务ID号,0----代表数据收集与确认
				pDoc->m_TaskInfo.ucERetryNo = 3;//期望重试次数为3
				pDoc->m_TaskInfo.ucRetryNo  = 0;//当前命令重试次数 
				pDoc->m_TaskInfo.ucCommandTotalNo = 1;//命令字总数为1
				pDoc->m_TaskInfo.ucCommandCurrentNo = 0;//命令字当前运行序号
				pDoc->m_TaskInfo.ucCommandArray[0] = 0x03;
				BuildTaskBuffer(pDoc,pBuffer,out,0);
				return;
			}
		}
		else //重新收集
		{
			pBuffer->ucMode = 0;
			return;
		}
	}
}