⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test.lst

📁 51单片机315模块双向通信代码,可直接使用.用于完成家电控制之类的小应用.
💻 LST
📖 第 1 页 / 共 2 页
字号:
 250          //发送程序后台部分同样会受影响,但由于此时后台发送肯定是空闲,所以忽略影响.
 251          //所以,调用原则是:发送时要确认发送与接收已全部停止
 252          unsigned char send_package(package_t *package){
 253   1              unsigned char check_sum;
 254   1              unsigned char len;
 255   1              unsigned char *p;
 256   1      
 257   1              package->head.package_len = W_BUF_LEN;//目前是将数据包长度定死,设包长的目的是为了将来扩展.
 258   1      
 259   1              len = package->head.package_len;        //为将来而设.今后发送包长可能在进放该函数前设定.
 260   1              if (len == 0)
 261   1                      return ERROR_SEND_NULL;
 262   1      
 263   1              //填写报文头
 264   1              package->head.source_id = this_node_id;
 265   1      
 266   1              //计算校验和,计算完后,报文所有字节(包括报文头)之和应为0
 267   1              package->head->check_sum = 0;
 268   1              check_sum = 0;
 269   1              p = (unsigned char*)package;
 270   1              do{
 271   2                      check_sum += *p;
 272   2                      p++;
 273   2              }while(--len);
 274   1              package->head->check_sum = ~check_sum;
 275   1      
 276   1              //发送
 277   1              START_SEND();
 278   1      
 279   1              while(!send_over)
 280   1                      w_send();
 281   1      
 282   1              return 0;
 283   1      }
 284          
 285          //由于计算校验合会占用大量时间,因此在调用该函数时发送程序后台部分会受影响,可能造成正在发送的数据报文时序错
             -乱.
 286          //接收程序后台部分同样会受影响,但由于此时后台接收肯定是已经完成的状态,所以忽略影响.
 287          //所以,调用原则是:发送时要确认发送程序已停止
 288          unsigned char recv_package(package_t *package){
 289   1              unsigned char check_sum;
 290   1              unsigned char len;
 291   1              unsigned char *p;
 292   1      
 293   1              if (len == 0)
 294   1                      return ERROR_RECV_NULL;
 295   1      
 296   1              //计算校验和
 297   1              len = package->head.package_len;
 298   1              check_sum = 0;
 299   1              p = (unsigned char*)package;
C51 COMPILER V7.20   TEST                                                                  11/06/2004 03:55:45 PAGE 6   

 300   1              do{
 301   2                      check_sum += *p;
 302   2                      p++;
 303   2              }while(--len);
 304   1              if(check_sum)
 305   1                      return ERROR_RECV_CHECKSUM;
 306   1      
 307   1              return 0;
 308   1      }
 309          
 310          void sys_thread(){
 311   1              if(!recv_over)
 312   1                      w_recv();
 313   1              //后面加上键盘扫描等驱动程序,但所有代码执行最长时间不得高于100微秒
 314   1      }
 315          
 316          typedef struct command_s{
 317                  unsigned char command_id;
 318                  unsigned char command_data[1];
 319          }command_t;
 320          
 321          #define GET_DEVICE_STATUS               0x11    //读取节点控制器所控制的设备的参数
 322          #define SET_DEVICE_STATUS               0x12    //设置节点控制器所控制的设备的参数
 323          #define GET_NODE_STATUS                 0x13    //读取节点控制器自身参数
 324          #define SET_NODE_STATUS                 0x14    //设置节点控制器自身参数
 325          
 326          #define ERROR_COMMAND_INVAILED  0x11    //错误的命令码
 327          
 328          typedef struct device_ctl_s{
 329                  unsigned char device_id;
 330                  unsigned char device_status;
 331          }device_ctl_t;
 332          
 333          unsigned char command_process(package_t *package){
 334   1              command_t *command = (command_t *)(package->package_data);
 335   1      
 336   1              switch(command->command_id){
 337   2                      case GET_DEVICE_STATUS:
 338   2                              package->head.target_id = package->head.source_id;
 339   2                              send_package(package);
 340   2                              break;
 341   2                      case GET_NODE_STATUS:
 342   2                              package->head.target_id = package->head.source_id;
 343   2                              send_package(package);
 344   2                              break;
 345   2                      case SET_DEVICE_STATUS:
 346   2                              package->head.target_id = 0xbb;
 347   2                              send_package(package);
 348   2                              START_RECV();//数据包处理完成,重新开启接收程序
 349   2                              break;
 350   2                      case SET_NODE_STATUS:
 351   2                              package->head.target_id = 0xcc;
 352   2                              send_package(package);
 353   2                              break;
 354   2                      default:
 355   2      //                      START_RECV();//数据包处理完成,重新开启接收程序
 356   2                              package->head.target_id = 0xdd;
 357   2                              send_package(package);
 358   2                              START_RECV();//数据包处理完成,重新开启接收程序
 359   2                              return ERROR_COMMAND_INVAILED;
 360   2              }
 361   1      
C51 COMPILER V7.20   TEST                                                                  11/06/2004 03:55:45 PAGE 7   

 362   1              START_RECV();//数据包处理完成,重新开启接收程序
 363   1      
 364   1              return 0;
 365   1      }
 366          
 367          #if 1
 368          void sleep(unsigned int time_out){
 369   1              unsigned int time=jiffies;
 370   1              unsigned char n=0;
 371   1              do{
 372   2                      ;
 373   2              }while(jiffies-time < time_out);
 374   1              return;
 375   1      }
 376          
 377          void send_test(){
 378   1              unsigned char device_id, device_status;
 379   1              package_t *package = w_buf;
 380   1              command_t *command = package->package_data;
 381   1              device_ctl_t *device_ctl = command->command_data;
 382   1              this_node_id = 0x20;
 383   1      
 384   1              while(1){
 385   2                      for(device_id=0; device_id<2; device_id++){
 386   3                              for(device_status=0; device_status<2; device_status++){
 387   4                                      STOP_RECV();
 388   4                                      memset(package, 0, W_BUF_LEN);
 389   4                                      package->head.target_id = 0x30;
 390   4                                      command->command_id = SET_DEVICE_STATUS;
 391   4                                      device_ctl->device_id=device_id;
 392   4                                      device_ctl->device_status=device_status;
 393   4                                      send_package(package);
 394   4                                      START_RECV();
 395   4                                      sleep(20000);
 396   4                              }
 397   3                      }
 398   2              }
 399   1      }
 400          
 401          void recv_test(){
 402   1              this_node_id = 0x30;
 403   1              while(1){
 404   2                      unsigned char i;
 405   2                      START_RECV();//数据包处理完成,重新开启接收程序
 406   2                      while(!recv_over)//等待数据包
 407   2                              sys_thread();
 408   2                      for(i=0; i<W_BUF_LEN; i++)
 409   2                              serial_out(w_buf[i]);
 410   2              }
 411   1      }
 412          
 413          #endif
 414          
 415          #if 0   //中央控制器
              void main(){
                      sys_init();
              
                      while(1){
                              unsigned char scmd;
                              sys_thread();
                              if(recv_over){
                                      unsigned char i;
C51 COMPILER V7.20   TEST                                                                  11/06/2004 03:55:45 PAGE 8   

                                      for(i=0; i<W_BUF_LEN; i++)
                                              serial_out(w_buf[i]);
                                      START_RECV();
                              }
                              if(RI && wait_serial(&scmd, 1, 0) == 0){//串口命令处理程序
                                      switch(scmd){
                                              case 'f':{              //fill w_buf and send
                                                      unsigned char ret, len;
                      
                                                      STOP_RECV();//停止接收,因为接收与发送是共用缓冲区,运行接收会干扰缓冲区.
                      
                                                      if(wait_serial(&len, 1, 1000))
                                                              break;
                                                      if(wait_serial(w_buf, len, 1000))
                                                              break;
                                                      ret = send_package((package_t *)w_buf);
                                                      serial_out(ret);
                      
                                                      break;
                                              }
                                              case 'g':{              //get w_buf
                                                      unsigned char len = W_BUF_LEN;
                                                      unsigned char *p = w_buf;
                      
                                                      if(recv_over){
                                                              do {
                                                                      serial_out(*p);//将数据传给主机
                                                                      p++;
                                                              }while(--len);
                                                      }else{
                                                              serial_out(ERROR_RECV_EMPTY);//目前缓冲区内空,无数据可取
                                                      }
                                                      break;
                                              }
                                      }
                                      START_RECV();
                              }
                      }
              }
              
              #else   //节点
 465          
 466          void main(){
 467   1              sys_init();
 468   1      
 469   1              while(1){
 470   2                      unsigned char ret;
 471   2                      package_t *package = (package_t*)w_buf;
 472   2                      while(!recv_over)//等待数据包
 473   2                              sys_thread();
 474   2      
 475   2                      //sleep(3000);
 476   2                      send_package(package);
 477   2                      START_RECV();//数据包处理完成,重新开启接收程序
 478   2                      continue;
 479   2      
 480   2                      ret = recv_package((package_t*)w_buf);//处理接收到的数据包,包括检查数据包的正确性
 481   2      
 482   2                      if(ret){
 483   3                              package_t *package = (package_t*)w_buf;
 484   3                              START_RECV();//数据包处理完成,重新开启接收程序
 485   3                              package->head.target_id = 0xaa;
C51 COMPILER V7.20   TEST                                                                  11/06/2004 03:55:45 PAGE 9   

 486   3                              send_package(package);
 487   3                              START_RECV();//数据包处理完成,重新开启接收程序
 488   3                      }else{
 489   3                              ret = command_process((package_t*)w_buf);
 490   3                      }
 491   2              }
 492   1      }
 493          #endif
 494          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1048    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     39      34
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      4    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -