angalp 发表于 2024-11-1 11:36:45

请教SPI-Flash-Writer-UART例程中的一些问题

本帖最后由 DebugLab 于 2024-11-1 11:43 编辑

SPI-Flash-Writer-UART例程中UART_Process()函数
while (bReadPtr != bWritePtr)是bReadPtr与bWritePtr不相等再执行里面的语句,什么条件不相等呢?是接收到串口数据吗?
dat = _getkey();      _getkey函数中又有个等待bReadPtr与bWritePtr相等 后执行return语句,while (bReadPtr == bWritePtr);又在什么条件下相等呢?

switch (stage)
      {
      default:
      case STG_IDLE:
L_CheckHead:
            if (dat == 'A')
                stage = STG_CMD_HEAD1;
            else
                stage = STG_IDLE;
            break;
      case STG_CMD_HEAD1:
            if (dat == 'I')
                stage = STG_CMD_HEAD2;
            else
                goto L_CheckHead;
            break;
      case STG_CMD_HEAD2:
            if (dat == 'C')
                stage = STG_CMD_HEAD3;
            else
                goto L_CheckHead;
            break;
      case STG_CMD_HEAD3:
            addr = 0;
            len = 0;
            index = 0;

default:    语句为啥又是放在switch里的第一个语句呢,不是放在最后吗



case STG_READ_ADDR0:
      case STG_READ_ADDR1:
      case STG_READ_ADDR2:
      case STG_READ_ADDR3:
      case STG_PROGRAM_ADDR0:
      case STG_PROGRAM_ADDR1:
      case STG_PROGRAM_ADDR2:
      case STG_PROGRAM_ADDR3:
      case STG_ERASE_ADDR0:
      case STG_ERASE_ADDR1:
      case STG_ERASE_ADDR2:
      case STG_ERASE_ADDR3:


为啥又要留这些语句呢?又不会执行什么

求教各位大佬




小坤 发表于 2024-11-1 13:07:16

本帖最后由 小坤 于 2024-11-1 13:09 编辑


BYTE bReadPtr;               
BYTE bWritePtr;                  
例程中都主注释了 串口的读写指针,这个是典型的环形队形数据的处理机制



       case STG_READ_ADDR0:
      case STG_READ_ADDR1:
      case STG_READ_ADDR2:
      case STG_READ_ADDR3:
      case STG_PROGRAM_ADDR0:
      case STG_PROGRAM_ADDR1:
      case STG_PROGRAM_ADDR2:
      case STG_PROGRAM_ADDR3:
      case STG_ERASE_ADDR0:
      case STG_ERASE_ADDR1:
      case STG_ERASE_ADDR2:
      case STG_ERASE_ADDR3:

            addr <<= 8;
            addr |= dat;
            stage++;
            if (stage == STG_ERASE_DONE)
            {
                switch (cmd)
                {
                case CMD_ERASE_4K:
                  W25Q_Erase4K_20(addr, FALSE);
                  UART_SendData("AIS", 3);
                  stage = STG_IDLE;
                  break;
                case CMD_ERASE_32K:
                  W25Q_Erase32K_52(addr, FALSE);
                  UART_SendData("AIS", 3);
                  stage = STG_IDLE;
                  break;
                case CMD_ERASE_64K:
                  W25Q_Erase64K_D8(addr, FALSE);
                  UART_SendData("AIS", 3);
                  stage = STG_IDLE;
                  break;
                default:
                  goto L_CheckHead;
                }
            }
            break;
以上的case ......条件都是执行下列的程序

angalp 发表于 2024-11-1 13:34:52

小坤 发表于 2024-11-1 13:07
BYTE bReadPtr;               
BYTE bWritePtr;                  
例程中都主注释了 串口的读写指针 ...

还是不明白{:4_167:}

angalp 发表于 2024-11-1 13:43:19

小坤 发表于 2024-11-1 13:07
BYTE bReadPtr;               
BYTE bWritePtr;                  
例程中都主注释了 串口的读写指针 ...

char _getkey()原来这个函数是C51库函数,我还以为是写例程的大佬自定义的函数呢{:4_198:}

angalp 发表于 2024-11-1 14:06:37

整明白了一些,分享下,串口接收到数据进入中断 bWritePtr++, UART_Process()函数while (bReadPtr != bWritePtr)语句成立,往下执行dat = _getkey();语句,读取缓冲区数据并返回;同时bReadPtr++,bWritePtr也就跟bReadPtr相等,程序再往下执行,判断是否接收到“AIC”指令,再往下执行......
页: [1]
查看完整版本: 请教SPI-Flash-Writer-UART例程中的一些问题