请教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: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 ......条件都是执行下列的程序
小坤 发表于 2024-11-1 13:07
BYTE bReadPtr;
BYTE bWritePtr;
例程中都主注释了 串口的读写指针 ...
还是不明白{:4_167:} 小坤 发表于 2024-11-1 13:07
BYTE bReadPtr;
BYTE bWritePtr;
例程中都主注释了 串口的读写指针 ...
char _getkey()原来这个函数是C51库函数,我还以为是写例程的大佬自定义的函数呢{:4_198:} 整明白了一些,分享下,串口接收到数据进入中断 bWritePtr++, UART_Process()函数while (bReadPtr != bWritePtr)语句成立,往下执行dat = _getkey();语句,读取缓冲区数据并返回;同时bReadPtr++,bWritePtr也就跟bReadPtr相等,程序再往下执行,判断是否接收到“AIC”指令,再往下执行......
页:
[1]