这段串口处理函数,要慢慢读,我加了注释:
先大致看懂,细节慢慢理解:
- else if((RX2_Buffer[0] == 'W') && (RX2_Cnt >= 12) && (RX2_Buffer[10] == ' ')) //写入N个字节
- {
-
- //检测要写入的空间是否为空
-
- j = RX2_Cnt - 11; //要写入的字节数
- for(i=0; i<j; i++) tmp[i] = 0xff; //循环初始化,典型的数组遍历或缓冲区填充操作
-
- /*将临时数组 tmp 的第 i 个元素赋值为 0xFF(即二进制 11111111)。
- 常见用途:
- 初始化:将缓冲区填充为固定值(如全1),可能用于后续校验或清空旧数据。
- 测试写入:模拟写入操作,检测硬件(如Flash、EEPROM)是否正常响应。
- 协议填充:某些通信协议要求空闲位或填充位为高电平(对应 0xFF)。存储设备(如Flash)的擦除或写入前准备。
- 而函数u8 SPI_Read_Compare(u32 addr, u8 *buffer, u16 size)的功能是
- 读出n个字节,跟指定的数据进行比较, 错误返回1,正确返回0
-
- */
-
- i = SPI_Read_Compare(Flash_addr,tmp,j);
-
-
- if(i > 0) //SPI_Read_Compare和全部是FF的数组对比,全部是FF返回0
- {
- PrintString2("要写入的地址为非空,不能写入,请先擦掉!\r\n");
- }
- else
- {
- SPI_Write_Nbytes(Flash_addr,&RX2_Buffer[11],j); //写N个字节
- //在C语言中,数组前面加&表示取整个数组的地址
- //&数组名的类型是指向整个数组的指针,而不是一个指向指针常量的指针
-
- i = SPI_Read_Compare(Flash_addr,&RX2_Buffer[11],j); //比较写入的数据
- if(i == 0)
- {
- PrintString2("已写入");
- if(j >= 100) {UART2_TxByte((u8)(j/100+'0')); j = j % 100;}
- if(j >= 10) {UART2_TxByte((u8)(j/10+'0')); j = j % 10;}
- UART2_TxByte((u8)(j%10+'0'));
- PrintString2("字节内容!\r\n");
- }
- else PrintString2("写入错误!\r\n");
- }
- F0 = 1;
- }
- else if((RX2_Buffer[0] == 'R') && (RX2_Cnt >= 12) && (RX2_Buffer[10] == ' ')) //读出N个字节
- {
- j = GetDataLength();
- if((j > 0) && (j < EE_BUF_LENGTH))
- {
- SPI_Read_Nbytes(Flash_addr,tmp,j);
- PrintString2("读出");
- if(j>=100) UART2_TxByte((u8)(j/100+'0'));
- UART2_TxByte((u8)(j%100/10+'0'));
- UART2_TxByte((u8)(j%10+'0'));
- PrintString2("个字节内容如下:\r\n");
- for(i=0; i<j; i++) UART2_TxByte(tmp[i]);
- UART2_TxByte(0x0d);
- UART2_TxByte(0x0a);
- F0 = 1;
- }
- }
- }
- }
- if(!F0) PrintString2("命令错误!\r\n");
复制代码
|