uart.C
上传用户:shyuanyi
上传日期:2008-05-24
资源大小:69k
文件大小:28k
源码类别:

RFID编程

开发平台:

C/C++

  1. #include  "My_head.h"
  2. #include  "MyProtocol.h"
  3. #include  "carddef.h"
  4. #include  "DS_addr.h"
  5. #include  "DataFlash.H"
  6. /****************************************************/
  7. #define   DE_RE           P3_6
  8. #define   UARTBUF_SIZE    180
  9. //===================================================
  10. BYTE  code   TieUpBus_Ordors[4]={0xAA,0X55,0x55,0xAA};
  11. BYTE  code   BoardCast_ADDR[2]={0xAA,0xFF};
  12. BYTE  xdata  uartSbuf[UARTBUF_SIZE];
  13. BYTE  pdata  uartRbuf[UARTBUF_SIZE];
  14. static  BYTE  uartRbuf_count = 0;
  15. bit   my_ti = FALSE;
  16. bit   dowith_receive_flag = FALSE;
  17. BYTE  idata  receive_head[4];
  18. BYTE  receive_head_counte =0;
  19. BYTE  receive_timer = 0;
  20. BYTE  enble_send_count = 0;
  21. //===================================================
  22. void  Uart_Int(void) interrupt 4 using 2
  23. {
  24.    bit  no_my_data_flag= FALSE;
  25.    register  BYTE  ch;
  26.    if(RI)
  27.      {
  28.   RI = FALSE;enble_send_count = 2;
  29.   ch = SBUF;
  30.   /**************** test ***********
  31.       if(uartRbuf_count<UARTBUF_SIZE)
  32.     {
  33.      uartRbuf[uartRbuf_count++] = ch;
  34.     }
  35.      if(uartRbuf_count>ORDOR_PLACE)
  36.     {
  37.      dowith_receive_flag = TRUE; //this is a test!
  38. }
  39.   /**********************************/
  40.   if(!receive_timer)
  41.     {
  42.  receive_timer=2;
  43.  receive_head_counte=0;
  44. }
  45.       if(receive_timer<3)
  46.     {
  47.      receive_head[receive_head_counte]=ch;
  48.  if(++receive_head_counte>3)
  49.       {
  50.             if(  (receive_head[0]!=TieUpBus_Ordors[0])
  51.    ||(receive_head[1]!=TieUpBus_Ordors[1])
  52.        ||(receive_head[2]!=TieUpBus_Ordors[2])
  53.    ||(receive_head[3]!=TieUpBus_Ordors[3]))
  54.    {
  55.     receive_timer=0;
  56. //receive_head_counte=0;
  57.    }
  58. else{
  59.      receive_timer=45;
  60.  uartRbuf_count=0;
  61.      //receive_head_counte=0;
  62.  //dowith_receive_flag = TRUE; //for test.
  63.     }
  64.    }
  65.  return;
  66. }
  67.   if((receive_timer<10)||(receive_timer>45))
  68.     {
  69.  receive_timer=0;
  70.  return;
  71. }
  72.   //=================================================================
  73.       if(uartRbuf_count<UARTBUF_SIZE)
  74.     {
  75.      uartRbuf[uartRbuf_count++] = ch;
  76.  ch = uartRbuf_count-1;
  77.     }
  78.   else ch = uartRbuf_count;
  79.   switch(ch)
  80.   {
  81.    case  ASP_PLACE:
  82.      if(uartRbuf[ch] != DOWN_ASP)
  83.   {
  84. no_my_data_flag = TRUE;
  85.   }
  86.  break;
  87.     case TYPE_PLACE:
  88.  if(uartRbuf[ch] != equip_addr.ntype)
  89.   {
  90. no_my_data_flag = TRUE;
  91.   }
  92.     //dowith_receive_flag = TRUE; //this is a test!
  93.  break;
  94. case NUMBER_PLACE1:
  95.          if((uartRbuf[ch] != ((BYTE *)(&equip_addr.number_addr))[0])
  96.      &&(uartRbuf[ch] != BoardCast_ADDR[0]))//并且不等于广播地址
  97.   {
  98. no_my_data_flag = TRUE;
  99.   }
  100.   break;
  101.  case NUMBER_PLACE2:
  102.   if((uartRbuf[ch] != ((BYTE *)(&equip_addr.number_addr))[1])
  103.          &&(uartRbuf[ch] != BoardCast_ADDR[1]))//并且不等于广播地址
  104.   {
  105. no_my_data_flag = TRUE;
  106.   }
  107.   break;
  108.          case DATLENGTH_PLACE:
  109.   if((uartRbuf[ch]<FRAMELENGTH_MIN)||(uartRbuf[ch]>FRAMELENGTH_MAX))
  110.   {
  111. no_my_data_flag = TRUE;
  112.   }
  113.   break;
  114.  default:
  115.   if((ch>ORDOR_PLACE) && (ch>=uartRbuf[DATLENGTH_PLACE]))
  116.     {
  117.  REN = FALSE;  //for run-time!
  118.          dowith_receive_flag = TRUE;
  119.   }
  120.   break;
  121.    }
  122.       if(no_my_data_flag)
  123.    {
  124.  REN=FALSE;  //for run-time!
  125.          receive_timer=1;
  126.  receive_head_counte=0; //MUST!!
  127.  //uartRbuf_count=0;
  128.    }
  129.   /********************************/
  130.      }
  131.    if(TI){my_ti=TI=FALSE;}
  132. }
  133. /*************************************************************/
  134. /*       uart_send                                           */
  135. /*************************************************************/
  136. void  Uart_Putc(BYTE  ch)
  137. {
  138.    while(my_ti);
  139.    SBUF = ch;
  140.    my_ti= TRUE;
  141. }
  142. bit  SendStr(BYTE *ptr,int  count)  //"BYTE"  modiry to "int" by 2004-6-18
  143. {                                   //"void"  modify "bit"  by  2004-07-08
  144.   int  i;
  145.   //if(count>512)return;
  146.   Set_Timer20ms(5);
  147.   while(enble_send_count)if(!Get_Timer20ms())return(FALSE);
  148.   REN   = FALSE;
  149.   DE_RE = 0;
  150.   TB8   = 1;
  151.   for(i=0;i<count;i++)
  152.     {
  153.  //Save_My_TestData(ptr[i]);
  154.  Uart_Putc(ptr[i]);
  155. }
  156.   delay_ms(2);//must for RS485!
  157.   DE_RE = 1;
  158.   REN   = TRUE;
  159.   return(TRUE);
  160. }
  161. /*************************************************************/
  162. void  UartBuf_Clear(void)
  163. {
  164.    BYTE   i=0;
  165.    for(;i<UARTBUF_SIZE;i++)uartRbuf[i]=0;
  166.    uartRbuf_count=0;
  167.    dowith_receive_flag = FALSE;
  168.    my_ti = FALSE;
  169. }
  170. void  Uart_Init(void)
  171. {
  172.    TR1   = 0;
  173.    IP   |= 0X10;   // ES优先级1
  174.    //SCON  = 0x50;   // 8位UART,波特率可变 REN=1
  175.    SCON  = 0xF0,TB8=1;   // 9位UART,波特率可变 REN=1,摸停止位。
  176.    TMOD &= 0x0f;   // 方式寄存器
  177.    TMOD |= 0x20;   // T1设为自动再装入8位计数器,或者分成2个8位计数器
  178.    ES    = 1;      //(ES为串行口中断允许位)
  179.    TH1=TL1=0xFA;   // 0xfA--9600bps(22.1184Mhz)
  180.    PCON |= 0x80;   // PCON.7为波特率加倍,PCON的其他位为掉电控制位
  181.                    // 2004-7-21改为波特率19200
  182.    TR1 = 1;        // TCON |= 0x40;
  183. #if(MCU_IC==SST564)  //EXTRAM = AUXR^2;
  184.    AUXR  &= ~0x02;   //0: Internal Expanded RAM access.
  185. #elif(MCU_IC==SM5964)//OME = SCONF^2;
  186.    SCONF |= 0x02;    //1: default is enable.
  187. #endif
  188.    DE_RE = 1;
  189.    UartBuf_Clear();
  190.    //delay_ms(1);
  191. }
  192. bit  Check_BCCsum(BYTE *buf)
  193. {
  194.   BYTE len,BCC_sum;//ii;
  195.   for(BCC_sum=0,len=0;len<buf[DATLENGTH_PLACE];len++)
  196.    {
  197.      BCC_sum ^= buf[len];
  198.    }
  199.   if(~BCC_sum != buf[len])return(FALSE); //CRCERR;
  200.   return(TRUE);
  201. }
  202. void  Set_BCCsum(BYTE *buf,BYTE nCount)
  203. {
  204.     BYTE   ii;
  205.     for(buf[nCount]=0,ii=0;ii<nCount;ii++)
  206. {
  207.   buf[nCount]^=buf[ii];
  208. }
  209. buf[nCount]=~buf[nCount];
  210. }
  211. /*****************************************************
  212. BYTE  Do_Uart_Event(BYTE dat)  //这样可以把uartSbuf节约出来?
  213.    {
  214.     PostMessage(MY_UART_EVENT,0);
  215.     dowith_receive_flag = FALSE;
  216. return(TRUE);
  217.    }
  218. /*---------------------------------------------------*/
  219. bit   close_dis_led = FALSE;
  220. bit   Check_Uart_Event(void)
  221. {
  222.    BYTE  len;//,BCC_sum;//ii;
  223.    if(!dowith_receive_flag)
  224.    {
  225.  if(receive_timer && !close_dis_led)
  226.    {
  227.  Dis_Comming_Led(TRUE);//0-close;1--open.
  228.  close_dis_led = TRUE; //for time and spi bus.
  229.    }
  230.  else if(close_dis_led)
  231.    {
  232.      Dis_Comming_Led(FALSE);//0-close;1--open.
  233.      close_dis_led = FALSE; //for time and spi bus.
  234.    }
  235.  return(FALSE);
  236.    }
  237.    memcpy(uartSbuf,uartRbuf,uartRbuf_count);
  238.    len=uartRbuf_count,uartRbuf_count = 0;
  239.    dowith_receive_flag = FALSE;
  240.    receive_timer  = 45; //for continue!
  241.    REN = TRUE;
  242.    if(uartSbuf[FRAMECODE_PLACE]&THELAST_FRAME)
  243.    {
  244.      receive_timer = 0; //for renew  the head str!
  245.    }
  246.    /***********this is a test!!************************
  247.    Set_BCCsum(uartSbuf,uartSbuf[DATLENGTH_PLACE]);
  248.    SendStr(uartSbuf,len);//REN = TRUE;
  249.    do_buzzer(1);
  250.    /***************************************************/
  251.    if(!Check_BCCsum(uartSbuf))return(FALSE);//CRCERR;
  252.    //do_buzzer(1);
  253.    //SendStr("OK",2);
  254.    switch(uartSbuf[ORDOR_PLACE])
  255.    {
  256. case CHECKEQUIP_ORDOR://         0x50
  257.          Do_CheckEquip(Equip_CurStatus);
  258.  break;
  259. case SetNumber_ORDOR://          0x52
  260.      Do_SetNumber();
  261.      break;
  262. case GetNumber_ORDOR://          0x99
  263.      Do_GetNumber();
  264.      break;
  265.     
  266. //自动充值数据
  267. case SetAutoGainCards_ORDOR://  0xC5
  268. Do_SetAutoGainCards();
  269. break;
  270. case GetAutoGainCards_ORDOR://  0xC6
  271. Do_GetAutoGainCards();
  272. break;
  273. //自动充值限制
  274. case SetAutoGainParam_ORDOR://    0xC7
  275. Do_SetAutoGainParam();
  276. break;
  277. case GetAutoGainParam_ORDOR://    0xC8
  278. Do_GetAutoGainParam();
  279. break;
  280.     //=========================================
  281. case ClearConParam_ORDOR://      0x57
  282.      Do_ClearConParam();
  283.      break;
  284. case SetBh_Money_ORDOR://        0x58
  285.         // Do_SetBh_Money();
  286.  break;
  287. case GetBh_Money_ORDOR://        0x59
  288.         // Do_GetBh_Money();
  289.  break;
  290. case SendDcpeoples_ORDOR://      0x5A
  291.     // Do_SendDcpeoples();
  292.      break;
  293. case SetSystemTime_ORDOR://      0x60
  294.      Do_SetSystemTime();
  295.  break;
  296.     case GetSystemTime_ORDOR://      0x61
  297.      Do_GetSystemTime();
  298.  break;
  299. case SetLostCardTime_ORDOR://    0x63
  300.      //Do_SetLostCardTime();
  301.  break;
  302. case GetLossCardsTime_ORDOR://   0x64
  303.     // Do_GetLossCardsTime();
  304.  break;
  305.     /************************************/
  306. case SendCardStatus_ORDOR://     0x62 
  307.      Do_SendCardStatus();
  308.  break;
  309. case GetCardStatus_ORDOR://      0x65
  310.      Do_GetCardStatus();
  311.          break;
  312.     /************************************/
  313. case ReadConData_ORDOR://        0x70
  314.          Do_ReadConData();
  315.  break;
  316. case SetConRecode_ORDOR://       0x71
  317.      Do_SetConRecode();
  318.  break;
  319. case SendCardGain_ORDOR://       0x72
  320.      //Do_SendCardGain();
  321.  break;
  322. case GetCardGain_ORDOR://        0x73
  323.          //Do_GetCardGain();
  324.      break;
  325. case GetConStatusInfo_ORDOR://     0x75
  326.          Do_GetConStatusInfo();
  327.  break;
  328. case GetEquipVersionInfo_ORDOR://  0x76
  329.          Do_GetEquipVersionInfo();
  330.  break;
  331. /**************************************/
  332. case GetCardLevel_ORDOR://         0x80
  333.      //Do_GetCardLevel();
  334.  break;
  335. case SetSeedCard_ORDOR://          0x81
  336.      //Do_SetSeedCard();
  337.      break;
  338. case GetUserCardInfo_ORDOR://      0x82
  339.      //Do_GetUserCardInfo();
  340.  break;
  341. case SetUserCardInfo_ORDOR://      0x83
  342.          //Do_SetUserCardInfo();
  343.  break;
  344. /**************************************/
  345. case SetOpUserInfo_ORDOR://        0x90
  346.      //Do_SetOpUserInfo();
  347.  break;
  348. case GetCurOpUserInfo://           0x91
  349.     // Do_GetCurOpUserInfo();
  350.  break;
  351. case GetOpUserInfo://              0x92
  352.      //Do_GetOpUserInfo();
  353.  break;
  354. default:break;
  355.    }
  356.    return(TRUE); //len
  357. }
  358. void   Do_CheckEquip(BYTE dat)
  359. {
  360.     BYTE  nCount            = ASP_PLACE;
  361.     uartSbuf[ASP_PLACE]     = UP_ASP;
  362. uartSbuf[TYPE_PLACE]    = equip_addr.ntype;
  363. uartSbuf[NUMBER_PLACE1] = ((BYTE*)&(equip_addr.number_addr))[0];
  364. uartSbuf[NUMBER_PLACE2] = ((BYTE*)&(equip_addr.number_addr))[1];
  365. //uartSbuf[DATLENGTH_PLACE]=
  366. //uartSbuf[FRAMECODE_PLACE]= THELAST_FRAME;//保持原来下传的不变。
  367. uartSbuf[ORDOR_PLACE]    = EQUIPANSWER_ORDOR;//0x51,所有重要数据都对方需要回答
  368.     nCount   = DATAST_PLACE;
  369. uartSbuf[nCount++] = dat;//Equip_CurStatus; //最近运行情况。
  370. uartSbuf[DATLENGTH_PLACE] = nCount;
  371.     Set_BCCsum(uartSbuf,nCount);
  372.     if(!SendStr(uartSbuf,nCount+1))Dis_Err(COMMERR);
  373. }
  374. //恢复设备到初始出厂状态。
  375. void  Do_ClearConParam(void) 
  376. {
  377.     BYTE  nCount,dat = SUCCESS;
  378. if(uartSbuf[DATLENGTH_PLACE]-DATAST_PLACE != 0)
  379. {
  380.   dat = FORMAT_ERR;
  381. }
  382.     else
  383.     {
  384.       dat=ClearConParam_From_Mem(); //恢复到初始出厂状态。
  385. }
  386.     uartSbuf[ASP_PLACE]     = UP_ASP;
  387. uartSbuf[TYPE_PLACE]    = equip_addr.ntype;
  388. uartSbuf[NUMBER_PLACE1] = ((BYTE*)&(equip_addr.number_addr))[0];
  389. uartSbuf[NUMBER_PLACE2] = ((BYTE*)&(equip_addr.number_addr))[1];
  390. //uartSbuf[DATLENGTH_PLACE]=
  391. //uartSbuf[FRAMECODE_PLACE]= THELAST_FRAME;//保持原来下传的不变。
  392. uartSbuf[ORDOR_PLACE]    = AckSetGet_ORDOR;
  393.     nCount   = DATAST_PLACE;
  394. uartSbuf[nCount++] = dat;
  395. uartSbuf[DATLENGTH_PLACE] = nCount;
  396.     Set_BCCsum(uartSbuf,nCount);
  397.     if(!SendStr(uartSbuf,nCount+1))Dis_Err(COMMERR);
  398. if(dat==SUCCESS)
  399. {
  400.    //Dis_ConMode();
  401.    do_buzzer(BUZZER_WAIT);
  402. }
  403. }
  404. //设置自动充值参数
  405. void Do_SetAutoGainParam(void)
  406. {
  407.     BYTE  nCount = ASP_PLACE;
  408.     BYTE  dat = SUCCESS;
  409. if(uartSbuf[DATLENGTH_PLACE]-DATAST_PLACE<sizeof(sttFillLimitInfo))
  410.   dat = FORMAT_ERR;
  411.     else
  412.       dat=WriteFillLimitInfo((sttFillLimitInfo*)&uartSbuf[DATAST_PLACE]);
  413.     uartSbuf[ASP_PLACE]     = UP_ASP;
  414. uartSbuf[TYPE_PLACE]    = equip_addr.ntype;
  415. uartSbuf[NUMBER_PLACE1] = ((BYTE*)&(equip_addr.number_addr))[0];
  416. uartSbuf[NUMBER_PLACE2] = ((BYTE*)&(equip_addr.number_addr))[1];
  417. //uartSbuf[DATLENGTH_PLACE]=
  418. //uartSbuf[FRAMECODE_PLACE]= THELAST_FRAME;//保持原来下传的不变。
  419. uartSbuf[ORDOR_PLACE]    = AckSetGet_ORDOR;
  420.     nCount   = DATAST_PLACE;
  421. uartSbuf[nCount++] = dat;
  422. uartSbuf[DATLENGTH_PLACE] = nCount;
  423.     Set_BCCsum(uartSbuf,nCount);
  424.     if(!SendStr(uartSbuf,nCount+1))Dis_Err(COMMERR);
  425. if(dat==SUCCESS)
  426. {
  427.    //Dis_ConMode();
  428.    do_buzzer(BUZZER_WAIT);
  429. }
  430. }
  431. //读取自动充值参数
  432. void Do_GetAutoGainParam(void)
  433. {
  434.     BYTE  nCount = ASP_PLACE;
  435.     uartSbuf[ASP_PLACE]     = UP_ASP;
  436. uartSbuf[TYPE_PLACE]    = equip_addr.ntype;
  437. uartSbuf[NUMBER_PLACE1] = ((BYTE*)&(equip_addr.number_addr))[0];
  438. uartSbuf[NUMBER_PLACE2] = ((BYTE*)&(equip_addr.number_addr))[1];
  439. //uartSbuf[DATLENGTH_PLACE]=
  440. //uartSbuf[FRAMECODE_PLACE]= THELAST_FRAME;//保持原来下传的不变。
  441. uartSbuf[ORDOR_PLACE]    = AckSetGet_ORDOR;
  442.     nCount   = DATAST_PLACE;
  443. ReadFillLimitInfo((sttFillLimitInfo*)&uartSbuf[DATAST_PLACE]);
  444.     //dat=restoreparam_from_Mem();
  445.     //memcpy(&uartSbuf[DATAST_PLACE],&stOrderDinnerTimeList,sizeof(stOrderDinnerTimeList));
  446.     nCount+=sizeof(sttFillLimitInfo);
  447. uartSbuf[DATLENGTH_PLACE] = nCount;
  448.     Set_BCCsum(uartSbuf,nCount);
  449.     if(!SendStr(uartSbuf,nCount+1))Dis_Err(COMMERR);
  450. }
  451. void  Do_SetSystemTime(void)
  452. {
  453.     BYTE  buf[7];// = {0x00,0x45,0x23,0x16,0x06,0x03,0x04};
  454.     BYTE  nCount;
  455.     BYTE  dat = SUCCESS;
  456. if(uartSbuf[DATLENGTH_PLACE]-DATAST_PLACE != 7)
  457. {
  458.   dat = FORMAT_ERR;
  459. }
  460.     else
  461.     {
  462.      nCount=DATAST_PLACE;
  463.       buf[YEAR_ADDR]=uartSbuf[nCount++];
  464.   buf[MOM_ADDR] =uartSbuf[nCount++];
  465.   buf[DATE_ADDR]=uartSbuf[nCount++];
  466.   buf[HOUR_ADDR]=uartSbuf[nCount++];
  467.   buf[MIN_ADDR] =uartSbuf[nCount++];
  468.   buf[SEC_ADDR] =uartSbuf[nCount++];
  469.   buf[DAY_ADDR] =uartSbuf[nCount++];
  470.      Do_WriteClock(buf);
  471. }
  472.     uartSbuf[ASP_PLACE]     = UP_ASP;
  473. uartSbuf[TYPE_PLACE]    = equip_addr.ntype;
  474. uartSbuf[NUMBER_PLACE1] = ((BYTE*)&(equip_addr.number_addr))[0];
  475. uartSbuf[NUMBER_PLACE2] = ((BYTE*)&(equip_addr.number_addr))[1];
  476. //uartSbuf[DATLENGTH_PLACE]=
  477. //uartSbuf[FRAMECODE_PLACE]= THELAST_FRAME;//保持原来下传的不变。
  478. uartSbuf[ORDOR_PLACE]   = AckSetGet_ORDOR;
  479.     nCount   = DATAST_PLACE;
  480. uartSbuf[nCount++] = dat;
  481. uartSbuf[DATLENGTH_PLACE] = nCount;
  482.     Set_BCCsum(uartSbuf,nCount);
  483.     if(!SendStr(uartSbuf,nCount+1))Dis_Err(COMMERR);
  484. if(dat==SUCCESS)
  485. {
  486.    DisplayDate();
  487.    do_buzzer(BUZZER_WAIT);
  488. }
  489. }
  490. void  Do_GetSystemTime(void)
  491. {
  492.     BYTE  buf[7];// = {0x00,0x45,0x23,0x16,0x06,0x03,0x04};
  493.     BYTE  nCount = ASP_PLACE;
  494.     uartSbuf[ASP_PLACE]     = UP_ASP;
  495. uartSbuf[TYPE_PLACE]    = equip_addr.ntype;
  496. uartSbuf[NUMBER_PLACE1] = ((BYTE*)&(equip_addr.number_addr))[0];
  497. uartSbuf[NUMBER_PLACE2] = ((BYTE*)&(equip_addr.number_addr))[1];
  498. //uartSbuf[DATLENGTH_PLACE]=
  499. //uartSbuf[FRAMECODE_PLACE]= THELAST_FRAME;//保持原来下传的不变。
  500. uartSbuf[ORDOR_PLACE]    = AckSetGet_ORDOR;
  501.     Do_ReadClock(buf);
  502.     nCount   = DATAST_PLACE;
  503.     uartSbuf[nCount++]=buf[YEAR_ADDR];
  504.     uartSbuf[nCount++]=buf[MOM_ADDR];
  505.     uartSbuf[nCount++]=buf[DATE_ADDR];
  506.     uartSbuf[nCount++]=buf[HOUR_ADDR];
  507.     uartSbuf[nCount++]=buf[MIN_ADDR];
  508.     uartSbuf[nCount++]=buf[SEC_ADDR];
  509.     uartSbuf[nCount++]=buf[DAY_ADDR];
  510. uartSbuf[DATLENGTH_PLACE] = nCount;
  511.     Set_BCCsum(uartSbuf,nCount);
  512.     if(!SendStr(uartSbuf,nCount+1))Dis_Err(COMMERR);
  513. }
  514. #define  FRAME_CONSTRUCT_S  (DATLENGTH_MAX/sizeof(Con_Record))
  515. void  Do_ReadConData(void)
  516. {
  517.     Con_Record  xdata  con_record;
  518.     BYTE  ii,dat,nCount;
  519.     //SendStr(uartSbuf,10);//for test.
  520. if(  ((uartSbuf[DATLENGTH_PLACE]-DATAST_PLACE) != 1)
  521.    ||((dat=uartSbuf[DATAST_PLACE])<1 )
  522.    ||( dat > FRAME_CONSTRUCT_S )
  523.   )
  524. {
  525.        Do_CheckEquip(FORMAT_ERR);
  526.    return;
  527.     }
  528.    
  529.     uartSbuf[ASP_PLACE]     = UP_ASP;
  530. uartSbuf[TYPE_PLACE]    = equip_addr.ntype;
  531. uartSbuf[NUMBER_PLACE1] = ((BYTE*)&(equip_addr.number_addr))[0];
  532. uartSbuf[NUMBER_PLACE2] = ((BYTE*)&(equip_addr.number_addr))[1];
  533. //uartSbuf[DATLENGTH_PLACE]=
  534. //uartSbuf[FRAMECODE_PLACE]= THELAST_FRAME;//保持原来下传的不变。
  535. uartSbuf[ORDOR_PLACE]    = AckSetGet_ORDOR;
  536.     nCount   = DATAST_PLACE;
  537. if((uartSbuf[FRAMECODE_PLACE]&FRAMES_MAX)==0)
  538. {
  539.    //do_buzzer(1);//Dis_Err(ii);
  540.        //SendStr((BYTE *)&myall_savedata.lread_page,2);
  541.        //SendStr((BYTE *)&myall_savedata.conread_page,2);
  542.        //SendStr((BYTE *)&myall_savedata.lread_byte,2);
  543.        //SendStr((BYTE *)&myall_savedata.conread_byte,2);
  544.        myall_savedata.lread_page = myall_savedata.conread_page;
  545.    myall_savedata.lread_byte = myall_savedata.conread_byte;
  546. }
  547.     while(dat--)
  548. {
  549.  if((ii=Read_ConData_From_Memory(&con_record))==SUCCESS)
  550.  {
  551.        memcpy(&uartSbuf[nCount],&con_record,sizeof(Con_Record));
  552.        nCount += sizeof(Con_Record);
  553.    //if(nCount>FRAMELENGTH_MAX)break;
  554.  }
  555.  else if(ii==NO_CON_RECORD)
  556.  {
  557.         uartSbuf[FRAMECODE_PLACE] |= THELAST_FRAME;
  558. receive_timer = 0; //must!
  559.     break;
  560.  }
  561.  else
  562.  {
  563.     Equip_CurStatus=ii;
  564.     Do_CheckEquip(ii);
  565.     do_buzzer(BUZZER_ALARM);//Dis_Err(ii);
  566. return;
  567.  }
  568. }
  569. uartSbuf[DATLENGTH_PLACE] = nCount;
  570.     Set_BCCsum(uartSbuf,nCount);
  571.     if(!SendStr(uartSbuf,nCount+1))Dis_Err(COMMERR);
  572.     /*
  573. if(uartSbuf[FRAMECODE_PLACE]&THELAST_FRAME)
  574. {
  575.    do_buzzer(2);//Dis_Err(ii);
  576.        myall_savedata.lread_page = myall_savedata.conread_page;
  577.    myall_savedata.lread_byte = myall_savedata.conread_byte;
  578. }
  579. */
  580. }
  581. void  Do_SetConRecode(void)
  582. {
  583.     Con_Record xdata con_record;
  584.     bit     renew_del_flag=FALSE; 
  585.     signed  short dat;
  586.     BYTE    ii,nCount;
  587.     //SendStr(uartSbuf,10);//for test.
  588. dat = *(signed  short*)(&uartSbuf[DATAST_PLACE]);
  589.     //*((BYTE *)(&dat+1))=uartSbuf[DATAST_PLACE+1];
  590. if(((uartSbuf[DATLENGTH_PLACE]-DATAST_PLACE) != 2)
  591.    ||(dat==0)||(dat>+250)||(dat<-250))
  592.     {
  593.        Do_CheckEquip(FORMAT_ERR);
  594.    return;
  595.     }
  596.     uartSbuf[ASP_PLACE]     = UP_ASP;
  597. uartSbuf[TYPE_PLACE]    = equip_addr.ntype;
  598. uartSbuf[NUMBER_PLACE1] = ((BYTE*)&(equip_addr.number_addr))[0];
  599. uartSbuf[NUMBER_PLACE2] = ((BYTE*)&(equip_addr.number_addr))[1];
  600. //uartSbuf[DATLENGTH_PLACE]=
  601. //uartSbuf[FRAMECODE_PLACE]= THELAST_FRAME;//保持原来下传的不变。
  602. uartSbuf[ORDOR_PLACE]   = AckSetGet_ORDOR;
  603.     nCount   = DATAST_PLACE;
  604. if(dat<0)
  605. {
  606.    renew_del_flag=TRUE; //TRUE:恢复
  607.    dat=-dat;
  608. }
  609.     //=============================================================
  610.     if(renew_del_flag)for(nCount=0;nCount<dat;nCount++) //TRUE:恢复
  611. {
  612.  if((ii=Renew_ConData_From_Memory(&con_record))==SUCCESS)
  613.  {
  614.    con_statusinfo.con_records++;
  615.    con_statusinfo.con_allmoney+=con_record.con_Money;
  616.  }
  617.  else if(ii==NO_CON_RECORD)
  618.  {
  619.         uartSbuf[FRAMECODE_PLACE] |= THELAST_FRAME;
  620. receive_timer = 0; //must!
  621.     break;
  622.  }
  623.  else
  624.  {
  625.     Equip_CurStatus=ii;
  626.     Do_CheckEquip(ii);
  627.     do_buzzer(BUZZER_ALARM);//Dis_Err(ii);
  628. return;
  629.  }
  630. }
  631.     //-----------------------------------------------------------
  632. else for(nCount=0;nCount<dat;nCount++)
  633. {
  634.  if((ii=Del_ConData_From_Memory(&con_record))==SUCCESS)
  635.  {
  636.        if((con_statusinfo.con_records>0))//&&(con_record.mark==CONSUME_FLAG))
  637.    {
  638.     con_statusinfo.con_records--;
  639.     con_statusinfo.con_allmoney-=con_record.con_Money;
  640. if(con_statusinfo.con_allmoney<0)con_statusinfo.con_allmoney=0L;
  641.    }
  642.  }
  643.  else if(ii==NO_CON_RECORD)
  644.  {
  645.     con_statusinfo.con_records = 0;   //理论上不必要!
  646. con_statusinfo.con_allmoney= 0L;  //理论上不必要!
  647.         uartSbuf[FRAMECODE_PLACE] |= THELAST_FRAME;
  648. receive_timer = 0; //must!
  649.     break;
  650.  }
  651.  else
  652.  {
  653.     Equip_CurStatus=ii;
  654.     Do_CheckEquip(ii);
  655.     do_buzzer(BUZZER_ALARM);//Dis_Err(ii);
  656. return;
  657.  }
  658. }
  659.     //============================================================
  660. if(nCount)Save_My_All_Data();//防乱掉电用。
  661. uartSbuf[DATAST_PLACE]    = nCount; //成功删除或恢复的记录个数。
  662. nCount=DATAST_PLACE+1;
  663. uartSbuf[DATLENGTH_PLACE] = nCount;
  664.     Set_BCCsum(uartSbuf,nCount);
  665.     if(!SendStr(uartSbuf,nCount+1))Dis_Err(COMMERR);
  666. }
  667. //设置自动充值数据
  668. void Do_SetAutoGainCards(void)
  669. {
  670. WORD  PageIndex=uartSbuf[DATAST_PLACE] * 0x100 + uartSbuf[DATAST_PLACE+1];
  671. BYTE  RecordCount=uartSbuf[DATAST_PLACE+2];
  672.     BYTE  nCount,dat;
  673. if(uartSbuf[DATLENGTH_PLACE]-DATAST_PLACE < (sizeof(sttFillPara)*RecordCount + 3))
  674. {
  675.   dat = FORMAT_ERR;
  676. }
  677.     else
  678.     {
  679.   //memcpy(stOrderDinnerParaList,&uartSbuf[DATAST_PLACE+2],Len);
  680.   dat=WriteFillPara(PageIndex,RecordCount,(sttFillPara*)&uartSbuf[DATAST_PLACE+3]);
  681. }
  682.     uartSbuf[ASP_PLACE]     = UP_ASP;
  683. uartSbuf[TYPE_PLACE]    = equip_addr.ntype;
  684. uartSbuf[NUMBER_PLACE1] = ((BYTE*)&(equip_addr.number_addr))[0];
  685. uartSbuf[NUMBER_PLACE2] = ((BYTE*)&(equip_addr.number_addr))[1];
  686. //uartSbuf[DATLENGTH_PLACE]=
  687. //uartSbuf[FRAMECODE_PLACE]= THELAST_FRAME;//保持原来下传的不变。
  688. uartSbuf[ORDOR_PLACE]    = AckSetGet_ORDOR;
  689.     nCount   = DATAST_PLACE;
  690. uartSbuf[nCount++] = dat;
  691. uartSbuf[DATLENGTH_PLACE] = nCount;
  692.     Set_BCCsum(uartSbuf,nCount);
  693.     if(!SendStr(uartSbuf,nCount+1))Dis_Err(COMMERR);
  694. if(dat==SUCCESS)
  695. {
  696.    do_buzzer(BUZZER_WAIT);
  697. }
  698. }
  699. //读取自动充值数据
  700. void Do_GetAutoGainCards(void)
  701. {
  702. WORD  PageIndex=uartSbuf[DATAST_PLACE] * 0x100 + uartSbuf[DATAST_PLACE+1];
  703. BYTE  RecordCount=uartSbuf[DATAST_PLACE+2];
  704.     BYTE  nCount = ASP_PLACE,dat;
  705. if((uartSbuf[DATLENGTH_PLACE]-DATAST_PLACE) != 3)return; //err.
  706. //if((dat=uartSbuf[DATAST_PLACE])<1 || dat>8)return;
  707.     uartSbuf[ASP_PLACE]     = UP_ASP;
  708. uartSbuf[TYPE_PLACE]    = equip_addr.ntype;
  709. uartSbuf[NUMBER_PLACE1] = ((BYTE*)&(equip_addr.number_addr))[0];
  710. uartSbuf[NUMBER_PLACE2] = ((BYTE*)&(equip_addr.number_addr))[1];
  711. //uartSbuf[DATLENGTH_PLACE]=
  712. //uartSbuf[FRAMECODE_PLACE]= THELAST_FRAME;//保持原来下传的不变。
  713. uartSbuf[ORDOR_PLACE]    = AckSetGet_ORDOR;
  714.     nCount   = DATAST_PLACE;
  715.     if(dat=ReadFillPara(PageIndex,RecordCount,(sttFillPara*)&uartSbuf[DATAST_PLACE])!=SUCCESS)
  716. {
  717.    Equip_CurStatus=dat;
  718.    Do_CheckEquip(dat);
  719.    do_buzzer(BUZZER_ALARM);//Dis_Err(ii);
  720.    return;
  721. }
  722.     //memcpy(&uartSbuf[DATAST_PLACE],&card_class,sizeof(sttOrderDinnerParameter)*RecordCount);
  723.     nCount += sizeof(sttFillPara)*RecordCount;
  724. uartSbuf[DATLENGTH_PLACE] = nCount;
  725.     Set_BCCsum(uartSbuf,nCount);
  726.     if(!SendStr(uartSbuf,nCount+1))Dis_Err(COMMERR);
  727. }
  728. void  Do_SetNumber(void)   //modify 2004-09-05
  729. {
  730.     BYTE  nCount = ASP_PLACE;
  731.     BYTE  dat = SUCCESS;
  732. if(uartSbuf[DATLENGTH_PLACE]-DATAST_PLACE != 2)
  733. {
  734.   dat = FORMAT_ERR;
  735. }
  736. else if(con_statusinfo.con_records>0)
  737. {
  738.   dat= OP_UNALLOWED;//可能还有消费数据
  739. }
  740.     else
  741.     {
  742.   //memcpy(&equip_addr,&uartSbuf[DATAST_PLACE],sizeof(Equip_Addr));
  743.       equip_addr.number_addr=*(WORD *)&uartSbuf[DATAST_PLACE];
  744.       dat=Saveparam_To_Mem();
  745. }
  746.     uartSbuf[ASP_PLACE]     = UP_ASP;
  747. uartSbuf[TYPE_PLACE]    = equip_addr.ntype;
  748. uartSbuf[NUMBER_PLACE1] = ((BYTE*)&(equip_addr.number_addr))[0];
  749. uartSbuf[NUMBER_PLACE2] = ((BYTE*)&(equip_addr.number_addr))[1];
  750. //uartSbuf[DATLENGTH_PLACE]=
  751. //uartSbuf[FRAMECODE_PLACE]= THELAST_FRAME;//保持原来下传的不变。
  752. uartSbuf[ORDOR_PLACE]   = AckSetGet_ORDOR;
  753.     nCount   = DATAST_PLACE;
  754. uartSbuf[nCount++] = dat;
  755. uartSbuf[DATLENGTH_PLACE] = nCount;
  756.     Set_BCCsum(uartSbuf,nCount);
  757.     if(!SendStr(uartSbuf,nCount+1))Dis_Err(COMMERR);
  758. if(dat==SUCCESS)
  759. {
  760.    do_buzzer(BUZZER_WAIT);
  761. }
  762. }
  763. void  Do_GetNumber(void)//and 2004-09-5
  764. {
  765.     BYTE  nCount;
  766.     uartSbuf[ASP_PLACE]     = UP_ASP;
  767. uartSbuf[TYPE_PLACE]    = equip_addr.ntype;
  768. uartSbuf[NUMBER_PLACE1] = ((BYTE*)&(equip_addr.number_addr))[0];
  769. uartSbuf[NUMBER_PLACE2] = ((BYTE*)&(equip_addr.number_addr))[1];
  770. //uartSbuf[DATLENGTH_PLACE]=
  771. //uartSbuf[FRAMECODE_PLACE]= THELAST_FRAME;//保持原来下传的不变。
  772. uartSbuf[ORDOR_PLACE]   = AckSetGet_ORDOR;
  773.     nCount   = DATAST_PLACE;
  774.     memcpy(&uartSbuf[nCount],&equip_addr,sizeof(Equip_Addr));
  775. nCount += sizeof(Equip_Addr);
  776. uartSbuf[DATLENGTH_PLACE] = nCount;
  777.     Set_BCCsum(uartSbuf,nCount);
  778.     if(!SendStr(uartSbuf,nCount+1))Dis_Err(COMMERR);
  779. }
  780. void  Do_GetConStatusInfo(void)
  781. {
  782.     BYTE  nCount = ASP_PLACE;
  783.     uartSbuf[ASP_PLACE]     = UP_ASP;
  784. uartSbuf[TYPE_PLACE]    = equip_addr.ntype;
  785. uartSbuf[NUMBER_PLACE1] = ((BYTE*)&(equip_addr.number_addr))[0];
  786. uartSbuf[NUMBER_PLACE2] = ((BYTE*)&(equip_addr.number_addr))[1];
  787. //uartSbuf[DATLENGTH_PLACE]=
  788. //uartSbuf[FRAMECODE_PLACE]= THELAST_FRAME;//保持原来下传的不变。
  789. uartSbuf[ORDOR_PLACE]   = AckSetGet_ORDOR;
  790.     nCount  = DATAST_PLACE;
  791.     //dat=restoreparam_from_Mem();
  792.     memcpy(&uartSbuf[nCount],&con_statusinfo,sizeof(Con_StatusInfo));
  793.     nCount += sizeof(Con_StatusInfo);
  794. uartSbuf[DATLENGTH_PLACE] = nCount;
  795.     Set_BCCsum(uartSbuf,nCount);
  796.     if(!SendStr(uartSbuf,nCount+1))Dis_Err(COMMERR);
  797. }
  798. extern const  BYTE  code  YsnOysFlag_Str[];
  799. extern const  BYTE  code  MyReVision_Str[];
  800. extern const  BYTE  code  Con_Types_Str[];
  801. void  Do_GetEquipVersionInfo(void)
  802. {
  803.     BYTE  nCount = ASP_PLACE;
  804.     uartSbuf[ASP_PLACE]     = UP_ASP;
  805. uartSbuf[TYPE_PLACE]    = equip_addr.ntype;
  806. uartSbuf[NUMBER_PLACE1] = ((BYTE*)&(equip_addr.number_addr))[0];
  807. uartSbuf[NUMBER_PLACE2] = ((BYTE*)&(equip_addr.number_addr))[1];
  808. //uartSbuf[DATLENGTH_PLACE]=
  809. //uartSbuf[FRAMECODE_PLACE]= THELAST_FRAME;//保持原来下传的不变。
  810. uartSbuf[ORDOR_PLACE]   = AckSetGet_ORDOR;
  811.     nCount   = DATAST_PLACE;
  812.     memcpy(&uartSbuf[nCount],Con_Types_Str,strlen(Con_Types_Str));
  813.     nCount+=strlen(Con_Types_Str);
  814.     memcpy(&uartSbuf[nCount],",",1);
  815.     nCount+=1;
  816.     memcpy(&uartSbuf[nCount],MyReVision_Str,strlen(MyReVision_Str));
  817.     nCount+=strlen(MyReVision_Str);
  818.     memcpy(&uartSbuf[nCount],&YsnOysFlag_Str[3],strlen(YsnOysFlag_Str)-2);
  819.     nCount+=strlen(YsnOysFlag_Str)-2;
  820. uartSbuf[DATLENGTH_PLACE] = nCount;
  821.     Set_BCCsum(uartSbuf,nCount);
  822.     if(!SendStr(uartSbuf,nCount+1))Dis_Err(COMMERR);
  823. }
  824. void  Do_SendCardStatus(void)
  825. {
  826. WORD PageIndex;
  827. BYTE Count=uartSbuf[DATAST_PLACE+2];
  828. BYTE Status=uartSbuf[DATAST_PLACE+3];
  829.     BYTE  nCount,dat;
  830. memcpy(&PageIndex,&uartSbuf[DATAST_PLACE],2); //包序号。
  831. if(uartSbuf[DATLENGTH_PLACE]-DATAST_PLACE < (4*Count + 4))
  832.   dat = FORMAT_ERR;
  833. else
  834.   dat=SaveCardStatusTable(PageIndex,&uartSbuf[DATAST_PLACE+4],Count,Status);
  835.     uartSbuf[ASP_PLACE]     = UP_ASP;
  836. uartSbuf[TYPE_PLACE]    = equip_addr.ntype;
  837. uartSbuf[NUMBER_PLACE1] = ((BYTE*)&(equip_addr.number_addr))[0];
  838. uartSbuf[NUMBER_PLACE2] = ((BYTE*)&(equip_addr.number_addr))[1];
  839. //uartSbuf[DATLENGTH_PLACE]=
  840. //uartSbuf[FRAMECODE_PLACE]= THELAST_FRAME;//保持原来下传的不变。
  841. uartSbuf[ORDOR_PLACE]    = AckSetGet_ORDOR;
  842.     nCount   = DATAST_PLACE;
  843. uartSbuf[nCount++] = dat;
  844. uartSbuf[DATLENGTH_PLACE] = nCount;
  845.     Set_BCCsum(uartSbuf,nCount);
  846.     if(!SendStr(uartSbuf,nCount+1))Dis_Err(COMMERR);
  847. if(dat==SUCCESS)
  848. {
  849.    do_buzzer(BUZZER_WAIT);
  850. }
  851. }
  852. void Do_GetCardStatus(void)
  853. {
  854. WORD  PageIndex;
  855. //BYTE Count=uartSbuf[DATAST_PLACE+2];
  856. BYTE  Status=uartSbuf[DATAST_PLACE+2];
  857.     BYTE  nCount,dat;
  858. memcpy(&PageIndex,&uartSbuf[DATAST_PLACE],2);
  859. if((uartSbuf[DATLENGTH_PLACE]-DATAST_PLACE) != 3)return; //err.
  860.     uartSbuf[ASP_PLACE]     = UP_ASP;
  861. uartSbuf[TYPE_PLACE]    = equip_addr.ntype;
  862. uartSbuf[NUMBER_PLACE1] = ((BYTE*)&(equip_addr.number_addr))[0];
  863. uartSbuf[NUMBER_PLACE2] = ((BYTE*)&(equip_addr.number_addr))[1];
  864. //uartSbuf[DATLENGTH_PLACE]=
  865. //uartSbuf[FRAMECODE_PLACE]= THELAST_FRAME;//保持原来下传的不变。
  866. uartSbuf[ORDOR_PLACE]    = AckSetGet_ORDOR;
  867.     nCount   = DATAST_PLACE;
  868.     if(dat=ReadCardStatusTable(PageIndex,&uartSbuf[DATAST_PLACE],33,Status)!=SUCCESS)
  869. {
  870.    Equip_CurStatus=dat;
  871.    Do_CheckEquip(dat);
  872.    do_buzzer(BUZZER_ALARM);//Dis_Err(ii);
  873.    return;
  874. }
  875.     //memcpy(&uartSbuf[DATAST_PLACE],&card_class,sizeof(sttOrderDinnerParameter)*RecordCount);
  876.     nCount += 4 * 33;
  877. uartSbuf[DATLENGTH_PLACE] = nCount;
  878.     Set_BCCsum(uartSbuf,nCount);
  879.     if(!SendStr(uartSbuf,nCount+1))Dis_Err(COMMERR);
  880. }