📄 uart.lst
字号:
378 4 else
379 4 temp=recv_buf[i];
380 4
381 4 checksum+=temp;
382 4 if(temp!=laddr)
383 4 wrongaddr=TRUE; // 地址不正确
384 4
385 4 i++; // 数据指针下移
386 4 }
387 3 nextstate=STATE_MSG_NUM; // 检查信息号
388 3 break;
389 3 case STATE_MSG_NUM:
390 3 if(maxtrans)
391 3 temp=SPIbuf[i];
392 3 else
393 3 temp=recv_buf[i];
394 3
395 3 if(temp<'0'||temp>'9')
396 3 errordect=TRUE; // 通信错误
397 3
398 3 checksum+=temp;
399 3 i++; // 数据指针下移
400 3 nextstate=STATE_STX; // 检查STX
401 3 break;
402 3 case STATE_STX:
403 3 if(maxtrans)
404 3 temp=SPIbuf[i];
405 3 else
406 3 temp=recv_buf[i];
407 3
408 3 if(temp==STX)
409 3 {
410 4 checksum+=STX;
411 4 nextstate=STATE_MSG_STRING;
412 4 }
413 3 else
414 3 errordect=TRUE; // 数据包不正确
415 3
416 3 i++; // 数据指针下移
417 3 break;
418 3 case STATE_MSG_STRING:
419 3 strindex=0;
420 3 while(TRUE)
421 3 {
422 4 if(maxtrans)
423 4 temp=SPIbuf[i];
424 4 else
425 4 temp=recv_buf[i];
426 4
427 4 if(temp==ETX)
C51 COMPILER V7.07 UART 09/14/2005 15:20:57 PAGE 8
428 4 {
429 5 checksum+=ETX;
430 5 break;
431 5 }
432 4 checksum+=temp;
433 4
434 4 i++; // 数据指针下移
435 4 strindex++;
436 4 if(strindex>MAX_COMMAND_LENGTH)
437 4 {
438 5 errordect=TRUE; // 命令超长
439 5 break;
440 5 }
441 4 }
442 3
443 3 i++; // 数据指针下移
444 3 nextstate=STATE_CHECKSUM; // 检查校验和
445 3 break;
446 3 case STATE_CHECKSUM:
447 3 if(maxtrans)
448 3 temp=SPIbuf[i];
449 3 else
450 3 temp=recv_buf[i];
451 3
452 3 testchecksum=Asc_hex(temp);
453 3 i++;
454 3
455 3 if(maxtrans)
456 3 temp=SPIbuf[i];
457 3 else
458 3 temp=recv_buf[i];
459 3
460 3 testchecksum=testchecksum<<4;
461 3 testchecksum+=Asc_hex(temp);
462 3 temp=(testchecksum+checksum)&0xFF;
463 3 if(temp!=0)
464 3 errordect=TRUE; // 校验和错
465 3
466 3 i++;
467 3 nextstate=STATE_EOT; // 检查结束
468 3 break;
469 3 case STATE_EOT:
470 3 if(maxtrans)
471 3 temp=SPIbuf[i];
472 3 else
473 3 temp=recv_buf[i];
474 3
475 3 if(temp!=EOT)
476 3 errordect=TRUE; // 没有结束错误
477 3 else
478 3 endofmessage=TRUE; // 信息包完整
479 3 break;
480 3 }
481 2
482 2 if(errordect||endofmessage||wrongaddr)
483 2 break;
484 2 }
485 1
486 1 if(wrongaddr)
487 1 {
488 2 ClearRcvBuf(); // 清接收缓冲区
489 2 return FALSE; // 地址错误直接返回,不进行任何操作
C51 COMPILER V7.07 UART 09/14/2005 15:20:57 PAGE 9
490 2 }
491 1
492 1 if(errordect)
493 1 {
494 2 ClearRcvBuf(); // 清接收缓冲区
495 2 sendmessage(NAK);
496 2 return FALSE; // 接收错误
497 2 }
498 1
499 1 if(endofmessage)
500 1 {
501 2 return TRUE; // 接收正确
502 2 }
503 1 }
504
505 ///////////////////////////////////////////////////////////////////////////////
506 // 上位机命令处理过程
507 ///////////////////////////////////////////////////////////////////////////////
508 void host_proc()
509 {
510 1 idata uint i;
511 1 idata uchar temp;
512 1
513 1 if(checkmessage()==TRUE)
514 1 {
515 2 if(readbuf()==TRUE) // 处理具体的上位机命令
516 2 {
517 3 if(maxtrans) // 大数据量传输模式
518 3 {
519 4 if((SPIbuf[COMMAND_PTR]=='S')&&(SPIbuf[COMMAND_PTR+1]=='C')
520 4 &&(SPIbuf[COMMAND_PTR+2]=='S')&&(SPIbuf[COMMAND_PTR+3]=='S'))
521 4 {
522 5 sendmessage(ACK); // 发送ACK,告诉主机正常执行
523 5
524 5 if(comm_ok) // 通信正常修改参数
525 5 maxtrans=FALSE; // 切换为小数据量传输模式
526 5 }
527 4 else if((SPIbuf[COMMAND_PTR]=='S')&&(SPIbuf[COMMAND_PTR+1]=='C')
528 4 &&(SPIbuf[COMMAND_PTR+2]=='S')&&(SPIbuf[COMMAND_PTR+3]=='L'))
529 4 {
530 5 sendmessage(ACK); // 发送ACK,告诉主机正常执行
531 5
532 5 if(comm_ok) // 通信正常修改参数
533 5 maxtrans=FALSE; // 切换为小数据量传输模式
534 5 }
535 4 else
536 4 {
537 5 SPIbuf[1]='0'; // 修改地址向DSP发送
538 5 SPIbuf[2]='1';
539 5 SPIbuf[3]='0';
540 5 SPIbuf[4]='2';
541 5
542 5 // 重新计算校验和
543 5 i=0;
544 5 checksum=0;
545 5 while(SPIbuf[i]!=ETX)
546 5 {
547 6 checksum+=SPIbuf[i];
548 6 i++;
549 6 }
550 5 checksum+=SPIbuf[i]; // ETX
551 5
C51 COMPILER V7.07 UART 09/14/2005 15:20:57 PAGE 10
552 5 checksum=~checksum+1;
553 5
554 5 temp=(checksum&0xF0)>>4;
555 5 i++;
556 5 SPIbuf[i]=Hex_ascii(temp);
557 5
558 5 temp=checksum&0x0F;
559 5 i++;
560 5 SPIbuf[i]=Hex_ascii(temp);
561 5
562 5 if(Send_spi()) // 直接向DSP发送
563 5 {
564 6 SPIbuf[1]=haddr; // 修改地址向上位机发送
565 6 SPIbuf[2]=laddr;
566 6 SPIbuf[3]='0';
567 6 SPIbuf[4]='0';
568 6
569 6 // 重新计算校验和
570 6 i=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -