/**************************************************************************** * 名 称:FS_Init * 功 能:初始化系统配置,小车配置等信息 * 参 数:无 * 反 回:无 * 说 明: ****************************************************************************/ void FS_Init(void) { #if SPI_FLASH_DEBUG u16 ChipID = 0; #endif SPI_Flash_Init(); #if SPI_FLASH_DEBUG ChipID = SPI_Flash_ReadID(); if((ChipID & FLASH_ID) == FLASH_ID) printf("Read SPI Flash Chip ID Success\r\n"); else printf("Read SPI Flash Chip ID Error\r\n"); #endif SPI_Flash_Read( CAR_CFG_OFFSET, (u8*)&Car_Save_Info, sizeof(Car_Save_Info)); if( strcmp( Car_Save_Info.CheckStr , CAR_CHECK_STR) != NULL ) { #if SPI_FLASH_DEBUG printf("Read CarPara Error,Write to Default Info\r\n"); #endif memset( (char*)&Car_Save_Info, 0x00, sizeof(Car_Save_Info)); sprintf(Car_Save_Info.CheckStr,"%s",CAR_CHECK_STR); Car_Save_Info.CarPara.RunMode = CAR_MODE_MANUAL; Car_Save_Info.CarPara.SetSpeed = 15; SPI_Flash_Write( CAR_CFG_OFFSET, (unsigned char *)&Car_Save_Info, sizeof(Car_Save_Info)); } #if SPI_FLASH_DEBUG printf("Read CarPara Success\r\n"); #endif SPI_Flash_Read( ROUTE_CFG_OFFSET, (u8*)&Route_Save_Info, sizeof(Route_Save_Info)); if( strcmp( Route_Save_Info.CheckStr , ROUTE_CHECK_STR) != NULL ) { #if SPI_FLASH_DEBUG printf("Read Route Error,Write to Default Info\r\n"); #endif memset( (char*)&Route_Save_Info, 0x00, sizeof(Route_Save_Info)); sprintf(Route_Save_Info.CheckStr,"%s",ROUTE_CHECK_STR); SPI_Flash_Write( ROUTE_CFG_OFFSET, (unsigned char *)&Route_Save_Info, sizeof(Route_Save_Info)); } #if SPI_FLASH_DEBUG printf("Read Route Success\r\n"); #endif }
//----读取BT参数--------------------------------------------------------------- u8 read_para_BT_enable() { u8 ch; SPI_Flash_Read((u8*)&ch, FILE_PARA_ADDR, 1); return ch; }
//初始化字体 //返回值:0,字库完好. //其他,字库丢失 u8 font_init(void) { u32 tempsys[2];//临时记录文件起始位置和文件大小 u8 fontok=0; SPI_Flash_Read(&fontok,FONTINFOADDR+24,1);//读出字库标志位,看是否存在字库 if(fontok!=0XAA)return 1;//字库错误.FLASH不存在字库 SPI_Flash_Read((u8*)tempsys,FONTINFOADDR,8);//读出8个字节 ftinfo.ugbksize=tempsys[1]; //UNIGBK的大小 SPI_Flash_Read((u8*)tempsys,FONTINFOADDR+8,8);//读出8个字节 ftinfo.f16addr=tempsys[0]; //FONT16的起始地址 return 0; }
//code 字符指针开始 //从字库中查找出字模 //code 字符串的开始地址,GBK码 //mat 数据存放地址 size*2 bytes大小 void Get_HzMat(unsigned char *code,unsigned char *mat,u8 size) { unsigned char qh,ql; unsigned char i; unsigned long foffset; qh=*code; ql=*(++code); if(qh<0x81||ql<0x40||ql==0xff||qh==0xff)//非常用汉字 { for(i=0;i<(size*2);i++)*mat++=0x00;//填充满格 return; //结束访问 } if(ql<0x7f)ql-=0x40;//注意! else ql-=0x41; qh-=0x81; foffset=((unsigned long)190*qh+ql)*(size*2);//得到字库中的字节偏移量 if(size==16)SPI_Flash_Read(mat,foffset+ftinfo.f16addr,32); else SPI_Flash_Read(mat,foffset+ftinfo.f12addr,24); }
DRESULT disk_read ( BYTE drv, /* Physical drive nmuber (0..) */ BYTE *buff, /* Data buffer to store read data */ DWORD sector, /* Sector address (LBA) */ BYTE count /* Number of sectors to read (1..255) */ ) { u8 res=0; if (!count)return RES_PARERR;//count不能等于0,否则返回参数错误 switch(drv) { case SD_CARD://SD卡 if (count > 1) { SD_ReadMultiBlocks(buff, sector*BLOCK_SIZE, BLOCK_SIZE, count); /* Check if the Transfer is finished */ SD_WaitReadOperation(); //循环查询dma传输是否结束 /* Wait until end of DMA transfer */ while(SD_GetStatus() != SD_TRANSFER_OK); } else { SD_ReadBlock(buff, sector*BLOCK_SIZE, BLOCK_SIZE); /* Check if the Transfer is finished */ SD_WaitReadOperation(); //循环查询dma传输是否结束 /* Wait until end of DMA transfer */ while(SD_GetStatus() != SD_TRANSFER_OK); } break; case EX_FLASH://外部flash for(;count>0;count--) { SPI_Flash_Read(buff,sector*BLOCK_SIZE,BLOCK_SIZE); sector++; buff+=BLOCK_SIZE; } res=0; break; default: res=1; } //处理返回值,将SPI_SD_driver.c的返回值转成ff.c的返回值 if(res==0x00)return RES_OK; else return RES_ERROR; }
void SPI_Flash_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite) { u32 secpos; u16 secoff; u16 secremain; u16 i; u8 * SPI_FLASH_BUF; #ifdef MEM_ALLOC_TABLE_SIZE SPI_FLASH_BUF=mymalloc(4096); //使用内存管理 if(SPI_FLASH_BUF==NULL)return; //申请失败 #else SPI_FLASH_BUF=SPI_FLASH_BUFFER; //不使用内存管理 #endif secpos=WriteAddr/4096;//扇区地址 0~511 for w25x16 secoff=WriteAddr%4096;//在扇区内的偏移 secremain=4096-secoff;//扇区剩余空间大小 if(NumByteToWrite<=secremain)secremain=NumByteToWrite;//不大于4096个字节 while(1) { SPI_Flash_Read(SPI_FLASH_BUF,secpos*4096,4096);//读出整个扇区的内容 SPI_USART_IO_SET(0);//SPI 工作 for(i=0;i<secremain;i++)//校验数据 { if(SPI_FLASH_BUF[secoff+i]!=0XFF)break;//需要擦除 } if(i<secremain)//需要擦除 { SPI_Flash_Erase_Sector(secpos);//擦除这个扇区 for(i=0;i<secremain;i++) //复制 { SPI_FLASH_BUF[i+secoff]=pBuffer[i]; } SPI_Flash_Write_NoCheck(SPI_FLASH_BUF,secpos*4096,4096);//写入整个扇区 }else SPI_Flash_Write_NoCheck(pBuffer,WriteAddr,secremain);//写已经擦除了的,直接写入扇区剩余区间. if(NumByteToWrite==secremain)break;//写入结束了 else//写入未结束 { secpos++;//扇区地址增1 secoff=0;//偏移位置为0 pBuffer+=secremain; //指针偏移 WriteAddr+=secremain;//写地址偏移 NumByteToWrite-=secremain; //字节数递减 if(NumByteToWrite>4096)secremain=4096; //下一个扇区还是写不完 else secremain=NumByteToWrite; //下一个扇区可以写完了 } }; SPI_USART_IO_SET(1);//USART2 工作 #ifdef MEM_ALLOC_TABLE_SIZE myfree(SPI_FLASH_BUF); //释放内存 #endif }
DRESULT disk_read ( BYTE drv, /* Physical drive nmuber (0..) */ BYTE *buff, /* Data buffer to store read data */ DWORD sector, /* Sector address (LBA) */ BYTE count /* Number of sectors to read (1..255) */ ) { SD_Error Status = SD_OK; switch(drv) { case SD_CARD://SD卡 //SD卡开始---------------------------------------- if (count == 1) { Status = SD_ReadBlock(buff, sector << 9 , SECTOR_SIZE); } else { Status = SD_ReadMultiBlocks(buff, sector << 9 , SECTOR_SIZE, count); } //SD卡结束---------------------------------------- break; case EX_FLASH://外部flash for(;count>0;count--) { SPI_Flash_Read(buff,sector*SECTOR_SIZE,SECTOR_SIZE); sector++; buff+=SECTOR_SIZE; } Status=SD_OK; break; default: Status=SD_ERROR; } if (Status == SD_OK) { return RES_OK; } else { printf("Err: SD_ReadMultiBlocks(,%d,%d)\r\n",sector,count); return RES_ERROR; } }
//用这个函数得到字体地址 //在系统使用汉字支持之前,必须调用该函数 //包括FONT16ADDR,FONT12ADDR,UNI2GBKADDR; u8 Font_Init(void) { u32 tempsys[2];//临时记录文件起始位置和文件大小 u8 fontok=0; SPI_Flash_Read(&fontok,24,1);//读出字库标志位,看是否存在字库 if(fontok!=0XAA)return 1; SPI_Flash_Read((u8*)tempsys,0,8);//读出8个字节 UNI2GBKADDR=tempsys[0]; //printf("tempsysgbk[0]:%d\n",tempsys[0]); //printf("tempsysgbk[1]:%d\n",tempsys[1]); SPI_Flash_Read((u8*)tempsys,8,8);//读出8个字节 //printf("tempsysf16[0]:%d\n",tempsys[0]); //printf("tempsysf16[1]:%d\n",tempsys[1]); FONT16ADDR=tempsys[0]; SPI_Flash_Read((u8*)tempsys,16,8);//读出8个字节 //printf("tempsysf12[0]:%d\n",tempsys[0]); //printf("tempsysf12[1]:%d\n",tempsys[1]); FONT12ADDR=tempsys[0]; return 0; }
//将UNICODE码转换为GBK码 //unicode:UNICODE码 //返回值:GBK码 u16 UnicodeToGBK(u16 unicode)//用二分查找算法 { u32 offset; u8 temp[2]; u16 res; if(unicode<=0X9FA5)offset=unicode-0X4E00; else if(unicode>0X9FA5)//是标点符号 { if(unicode<0XFF01||unicode>0XFF61)return 0;//没有对应编码 offset=unicode-0XFF01+0X9FA6-0X4E00; } SPI_Flash_Read(temp,offset*2+UNI2GBKADDR,2);//得到GBK码 res=temp[0]; res<<=8; res+=temp[1]; return res ; //返回找到的编码 }
/******************************************************************************* * Function Name : MAL_Read * Description : Read sectors * Input : None * Output : None * Return : 0,OK 1,FAIL *******************************************************************************/ u16 MAL_Read(u8 lun, u32 Memory_Offset, u32 *Readbuff, u16 Transfer_Length) { u8 STA; switch (lun) { case 0: STA=SD_ReadDisk((u8*)Readbuff, Memory_Offset>>9, Transfer_Length>>9); break; case 1: STA=0; SPI_Flash_Read((u8*)Readbuff, Memory_Offset, Transfer_Length); break; default: return MAL_FAIL; } if(STA!=0)return MAL_FAIL; return MAL_OK; }
void SPI_Flash_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite) { u32 secpos; u16 secoff; u16 secremain; u16 i; u8 * SPI_FLASH_BUF; SPI_FLASH_BUF=SPI_FLASH_BUFFER; secpos=WriteAddr/4096;//扇区地址 secoff=WriteAddr%4096;//在扇区内的偏移 secremain=4096-secoff;//扇区剩余空间大小 //printf("ad:%X,nb:%X\r\n",WriteAddr,NumByteToWrite);//测试用 if(NumByteToWrite<=secremain)secremain=NumByteToWrite;//不大于4096个字节 while(1) { SPI_Flash_Read(SPI_FLASH_BUF,secpos*4096,4096);//读出整个扇区的内容 for(i=0;i<secremain;i++)//校验数据 { if(SPI_FLASH_BUF[secoff+i]!=0XFF)break;//需要擦除 } if(i<secremain)//需要擦除 { SPI_Flash_Erase_Sector(secpos);//擦除这个扇区 for(i=0;i<secremain;i++) //复制 { SPI_FLASH_BUF[i+secoff]=pBuffer[i]; } SPI_Flash_Write_NoCheck(SPI_FLASH_BUF,secpos*4096,4096);//写入整个扇区 }else SPI_Flash_Write_NoCheck(pBuffer,WriteAddr,secremain);//写已经擦除了的,直接写入扇区剩余区间. if(NumByteToWrite==secremain)break;//写入结束了 else//写入未结束 { secpos++;//扇区地址增1 secoff=0;//偏移位置为0 pBuffer+=secremain; //指针偏移 WriteAddr+=secremain;//写地址偏移 NumByteToWrite-=secremain; //字节数递减 if(NumByteToWrite>4096)secremain=4096; //下一个扇区还是写不完 else secremain=NumByteToWrite; //下一个扇区可以写完了 } }; }
//更新某一个 //fxpath:路径 //fx:更新的内容 0,ungbk;1 ,gbk16; //返回值:0,成功;其他,失败. u8 updata_fontx(u8 *fxpath,u8 fx) { u32 flashaddr=0; u32 tempsys[2]; //临时记录文件起始位置和文件大小 FIL * fftemp; u8 res; u16 bread; u32 offx=0; fftemp=&gbkFile; if(fftemp==NULL)return 1; //内存分配出错. res=f_open(fftemp,(const TCHAR*)fxpath,FA_READ); if(res)//打开文件失败 { f_close(fftemp); return 2;//文件丢失 } if(fftemp==NULL)return 2; if(fx==0)//更新UNI2GBK.SYS { tempsys[0]=ftinfo.ugbkaddr; //UNIGBK存放地址 tempsys[1]=fftemp->fsize; //UNIGBK 大小 SPI_Flash_Write((u8*)tempsys,FONTINFOADDR,8); //记录在地址FONTINFOADDR+1~8处 flashaddr=ftinfo.ugbkaddr; } else//GBK16 { SPI_Flash_Read((u8*)tempsys,FONTINFOADDR,8); //读出8个字节 flashaddr=tempsys[0]+tempsys[1]; tempsys[0]=flashaddr; //GBK16的起始地址 tempsys[1]=fftemp->fsize; //GBK16 大小 SPI_Flash_Write((u8*)tempsys,FONTINFOADDR+8,8); //记录在地址FONTINFOADDR+1~8+16处 } while(res==FR_OK)//死循环执行 { res=f_read(fftemp,temp,1024,(UINT *)&bread); if(res!=FR_OK)break; //执行错误 SPI_Flash_Write(temp,offx+flashaddr,1024);//从0开始写入1024个数据 offx+=bread; fupd_prog(fftemp->fsize,offx); //进度显示 if(bread!=1024)break; //读完了. } return res; }
WCHAR ff_convert ( /* Converted code, 0 means conversion error */ WCHAR src, /* Character code to be converted */ UINT dir /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */ ) { WCHAR t[2]; WCHAR c; u32 i, li, hi; u16 n; u32 gbk2uni_offset=0; if (src < 0x80)c = src;//ASCII,直接不用转换. else { if(dir) //GBK 2 UNICODE { gbk2uni_offset=ftinfo.ugbksize/2; }else //UNICODE 2 GBK { gbk2uni_offset=0; } //if(UK_FLAG)//存在 { hi=ftinfo.ugbksize/2;//对半开. hi =hi / 4 - 1; li = 0; for (n = 16; n; n--) { i = li + (hi - li) / 2; SPI_Flash_Read((u8*)&t,ftinfo.ugbkaddr+i*4+gbk2uni_offset,4);//读出8个字节 if (src == t[0]) break; if (src > t[0])li = i; else hi = i; } c = n ? t[1] : 0; } ; } return c; }
u8 SearchId(FILE_RECORD_STRUCT new_card) { u32 addr; u32 finaladdr; u16 i; FILE_RECORD_STRUCT card; u8 ret = 0; if((new_card.time<LastSaveTime)||(new_card.time<0x51308fe9)||(new_card.time>0x96c8df8d)) // LastTime 修改 { ret = 3; //时间错误 goto loop2; } if(storeaddrlist.RecordCount>=RECORD_MAX_COUNT) { ret = 2; goto loop2; } if((timeoutaddrlist.RecordCount==0)) //表格内无数据 { ret = 0; finaladdr = FILE_SETION_START_DATA_ADDR; goto loop2; } finaladdr = FILE_SETION_START_DATA_ADDR + (timeoutaddrlist.RecordCount-1)*sizeof(FILE_RECORD_STRUCT); addr = finaladdr; for(i=0; i<SEARCH_MAX_NUM; i++) { if((addr<FILE_SETION_START_DATA_ADDR)||(addr>FILE_SETION_END_DATA_ADDR)) { ret = 4 ; /////地址出现异常 goto loop2; } SPI_Flash_Read((u8*)&card, addr, sizeof(FILE_RECORD_STRUCT)); if(((new_card.time - card.time)<=TIMEMAX)) //在比较时间内 { if(new_card.rfid==card.rfid) { ret = 1; goto loop2; //卡号重复 } } else //在一定时间段内无数据 { ret = 0; finaladdr += sizeof(FILE_RECORD_STRUCT); goto loop2; //需要保存 } if(addr==FILE_SETION_START_DATA_ADDR) addr = FILE_SETION_END_DATA_ADDR; else addr = addr - sizeof(FILE_RECORD_STRUCT); } loop2: if(ret!= 3) LastSaveTime = new_card.time; if(ret==0) { if(finaladdr>=FILE_SETION_END_DATA_ADDR) finaladdr = FILE_SETION_START_DATA_ADDR; SPI_Flash_WriteQ((u8*)&new_card, finaladdr, sizeof(FILE_RECORD_STRUCT)); //存储数据 SaveDate(&timeoutaddrlist); } return ret; }
int main(void) { u8 Data_PC[SIZE]; //从Flash中读取数据到Data_PC,并上传至上位机 u16 a,b=0; delay_init(); //延时函数初始化 NVIC_Configuration();//设置NVIC中断分组2:2位抢占优先级,2位响应优先级 uart_init(9600); //串口初始化为9600 LED_Init(); //LED端口初始化 LCD_Init(); KEY_Init(); WORD_Init(); TIM2_Int_Init(999,7199); TIM3_Int_Init(9,7199); EXTIX_Init(); //外部中断初始化 Adc_Init(); //ADC初始化 SPI_Flash_Init(); //SPI FLASH 初始化 while(1) { //功能:开机状态显示 //说明:1.开机,绿灯亮(DS1) // 2.使用temp是为了避免重复执行该if语句 if(flag2==1&&temp==0) { while(SPI_Flash_ReadID()!=W25Q64) //检测不到W25Q64 { LCD_ShowString(40,150,200,16,16,"W25Q64 Check Failed!"); delay_ms(500); LCD_ShowString(40,150,200,16,16,"Please Check! "); delay_ms(500); LED0=!LED0;//DS0闪烁 } LCD_ShowString(60,130,200,16,16,"W25Q64 Ready!"); LED1=0; temp=1; } //功能:数据采集并保存至Flash中 //说明:1.使用temp1是为了避免重复使能TIM3 // 2.使用temp2是为了避免在数据上传至上位机的过程中,与终止上传功能相冲突 // 3.flag1=1代表按键按下,并开始采集 // 4.flag2=1代表开机,flag2=0代表未开机 // 5.采集过程中,红灯(DS0)以一定频率闪烁 if(flag2==1&&temp2==0&&flag1==1) { if(temp1==0) { LCD_ShowString(20,150,200,16,16,"Data collection began..."); TIM_Cmd(TIM3, ENABLE); //使能TIM3中断 LED0=0; } temp1=1; if(flag_cycle==0&&flag_cycle_1==0) { SPI_Flash_Write((u8*)TEXT_Buffer2,FLASH_SIZE+counter*SIZE,SIZE); counter++; flag_cycle_1=1; } if(flag_cycle==1&&flag_cycle_1==0) { SPI_Flash_Write((u8*)TEXT_Buffer1,FLASH_SIZE+counter*SIZE,SIZE); counter++; flag_cycle_1=1; } } //功能:将Flash中采集到的数据上传至上位机 //说明:1.使用temp1是为了保证上传是在采集之后进行 // 2.使用temp3是为了避免由于按键误操作使得该程序重复被执行 // 3.flag1=0代表按键再次被按下,上传开始 ;若再次被按下,则上传被终止;之后再按就没有作用了 // 4.上传过程中,红灯(DS0)以一定频率闪烁 if(temp1==1&&temp3==0&&flag1==0) { TIM_Cmd(TIM3, DISABLE); //失能TIM3中断 //用于解决当采集时间不是42ms的倍数时,部分采集数据未写入FLash的问题 if((time_collect-1)%42!=0) { data_residue=(time_collect-1)%42*6; if(flag_cycle==0) { SPI_Flash_Write((u8*)TEXT_Buffer2,FLASH_SIZE+(counter+1)*SIZE,SIZE); } if(flag_cycle==1) { SPI_Flash_Write((u8*)TEXT_Buffer1,FLASH_SIZE+(counter+1)*SIZE,SIZE); } } LCD_ShowString(20,170,200,16,16,"Data collection complete!"); LCD_ShowString(20,190,200,16,16,"Data is being uploaded..."); temp2=1; for(a=1;a<counter;a++) { LED0=!LED0; SPI_Flash_Read(Data_PC,FLASH_SIZE+a*SIZE,SIZE); for(b=0;b<SIZE;b++) { if(flag1==1) //上传中途使用按键停止传送 { break; } USART_GetFlagStatus(USART1, USART_FLAG_TC); USART_SendData(USART1,Data_PC[b]); while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); } if(flag1==1) //上传中途使用按键停止传送 { LCD_ShowString(20,210,200,16,16,"Data upload is terminated!"); break; } } //用于解决当采集时间不是42ms的倍数时,部分采集数据未写入FLash的问题 if(flag1!=1&&(time_collect-1)%42!=0) { LED0=!LED0; SPI_Flash_Read(Data_PC,FLASH_SIZE+(a+1)*SIZE,SIZE); for(b=0;b<data_residue;b++) { if(flag1==1) //上传中途使用按键停止传送 { break; } USART_GetFlagStatus(USART1, USART_FLAG_TC); USART_SendData(USART1,Data_PC[b]); while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); } if(flag1==1) //上传中途使用按键停止传送 { LCD_ShowString(20,210,200,16,16,"Data upload is terminated!"); break; } } if(flag1!=1) //要么显示数据上传完成,要么显示数据上传完成 { LCD_ShowString(20,210,200,16,16,"Data upload is completed!"); } temp3=1; } //功能:关机并擦除Flash //说明:1.flag2=0代表关机,与上temp1,temp2是要保证前面的已被执行 // 2.关机过程中擦除Flash,完成之后红绿灯同时亮一秒后灭 if(temp1==1&&temp2==1&&flag2==0) //关机机状态显示 { flag1=0; flag2=0; temp1=0; temp2=0; LED0=1; LED1=1; SPI_Flash_Erase_Chip(); LED0=0; LED1=0; delay_ms(1000); LED0=1; LED1=1; LCD_ShowString(80,230,200,16,16,"Shutdown!"); } } }
/* * 函数名:USART3_ReceiveDW() * 描述: 串口3数据接收处理 * 输入: 无 * 输出: 无 * 返回: 无 */ void USART3_ReceiveDW() //接收到的数据处理 { if(USART3_Flag & 0x20) { u8 tem=(USART3_RxBuffer[1]-0x30)*10+USART3_RxBuffer[2]-0x30; //计算命令字 switch(USART3_RxBuffer[0]) { case 'R': { //读命令 switch(tem) { case 1: //发送本机地址 { Send_Address(); Clear_RxBuffer(); break; } case 2: //发送本机机器类型 { Send_MACHINE_TYPE(); Clear_RxBuffer(); break; } case 3: //发送本机当前运行状态 { USART3_TxBuffer[0]=RUN_STATE; USART3_TxBuffer[1]=0x0D; //结束符 USART3_TxBuffer[2]=0x0A; USART3_TxLen=3; USART3_SendDW(); Clear_RxBuffer(); break; } case 4: //发送机器当前模具条码 { SendMJCode(); Clear_RxBuffer(); break; } case 5: //发送当前员工条码 { SendYGCode(); Clear_RxBuffer(); break; } case 6: //发送机器当前模具开模总数 { Send_MMYY(MJ_Cnt); Clear_RxBuffer(); break; } case 7: //发送机器当前模具安装时间 { Send_MMYY(MJ_Tim); Clear_RxBuffer(); break; } case 8: //发送机器当前员工开模计数 { Send_MMYY(YG_Cnt); Clear_RxBuffer(); break; } case 9: //发送机器当前员工在岗时间 { Send_MMYY(YG_Tim); Clear_RxBuffer(); break; } case 20: //返回指令字001命令 { USART3_SendWorld=1; Clear_RxBuffer(); break; } case 21: //返回指令字110命令 { USART3_SendWorld=2; Clear_RxBuffer(); break; } case 22: //返回指令字111命令 { USART3_SendWorld=3; Clear_RxBuffer(); break; } case 23: //返回指令字112命令 { USART3_SendWorld=4; Clear_RxBuffer(); break; } case 24: //返回指令字113命令 { USART3_SendWorld=5; Clear_RxBuffer(); break; } case 25: //返回指令字114命令 { USART3_SendWorld=6; Clear_RxBuffer(); break; } case 26: //返回指令字110命令 { USART3_SendWorld=19; Clear_RxBuffer(); break; } case 27: //返回指令字111命令 { USART3_SendWorld=8; Clear_RxBuffer(); break; } case 28: //返回指令字112命令 { USART3_SendWorld=9; Clear_RxBuffer(); break; } case 29: //返回指令字113命令 { USART3_SendWorld=10; Clear_RxBuffer(); break; } case 30: //返回指令字114命令 { USART3_SendWorld=11; Clear_RxBuffer(); break; } case 31: //返回指令字115命令 { USART3_SendWorld=12; Clear_RxBuffer(); break; } case 32: //返回指令字116命令 { USART3_SendWorld=13; Clear_RxBuffer(); break; } case 33: //返回指令字117命令 { USART3_SendWorld=14; Clear_RxBuffer(); break; } case 34: //返回系统上电信息 { USART3_SendWorld=15; Clear_RxBuffer(); break; } case 35: //返回员工上岗信息 { USART3_SendWorld=16; Clear_RxBuffer(); break; } case 36: //返回模具安装信息 { USART3_SendWorld=17; Clear_RxBuffer(); break; } case 37: //返回模具安装信息 { USART3_SendWorld=19; Clear_RxBuffer(); break; } default : { //命令错误 Send_Error(); Clear_RxBuffer(); break; } } break; } case 'W': { //写命令 switch(tem) { case 1: //修改本机地址 { SPI_Flash_Write(&USART3_RxBuffer[3],Flash_Base0,3); //修改本机站号 SPI_Flash_Read(ADDRESS,Flash_Base0,3); //读取地址 Send_Address(); //返回修改后的地址 Clear_RxBuffer(); break; } case 2: //修改本机机器类型 { SPI_Flash_Write(&USART3_RxBuffer[3],Flash_Base1,2); //修改本机机器类型 SPI_Flash_Read(MACHINE_TYPE,Flash_Base1,2); //读取机器类型 Send_MACHINE_TYPE(); //返回修改后的机器类型 Clear_RxBuffer(); break; } case 3: //修改模具条码 { Clear_RxBuffer(); break; } case 4: //修改员工条码 { u8 i; if(YGTM_Flag & 0x01) {//当前有员工条码 if(YG_CodeLend == (USART3_RxCounter-5)) { //新接收的员工条码与旧的员工条码长度相同 if(Char_Compare(YG_Code,&USART3_RxBuffer[3],YG_CodeLend)==1) {//接收到相同的条码,认为员工结束上岗 YGTM_Flag =0; //清员工条码标志位 USART3_SendWorld=14; //发送员工上岗结束 } else {//接收到不同的条码 YGTM_Flag = 0; YGTM_Flag |= 0x02; //清员工条码标志位 USART3_SendWorld=14; //发送员工上岗结束 for(i=0;i<USART3_RxCounter-5;i++) New_YG_Code[i]=USART3_RxBuffer[i+3]; New_YG_CodeLend=USART3_RxCounter-5; } } else {//新接收的员工条码与旧的员工条码长度不相同,则认为接收到新条码 YGTM_Flag =0; YGTM_Flag |=02; //清员工条码标志位 USART3_SendWorld=14; //发送员工上岗结束 for(i=0;i<USART3_RxCounter-5;i++) New_YG_Code[i]=USART3_RxBuffer[i+3]; New_YG_CodeLend=USART3_RxCounter-5; } } else {//当前无员工条码,则认为接收到新条码 YGTM_Flag |=0X01; //标志当前有条码 for(i=0;i<USART3_RxCounter-5;i++) YG_Code[i]=USART3_RxBuffer[i+3]; YG_CodeLend=USART3_RxCounter-5; USART3_SendWorld=13; //发送新条员工码数据 } Clear_RxBuffer(); break; } case 5: {//订单生产完毕,指示灯闪烁 LED_ON(); Clear_RxBuffer(); break; } case 6: {//指示灯停止闪烁 LED_OFF(); Clear_RxBuffer(); break; } case 7: {//修改模具开模数量,:W07|1234 MJ_Cnt=(USART3_RxBuffer[5]-0x30)*1000+(USART3_RxBuffer[6]-0x30)*100+(USART3_RxBuffer[7]-0x30)*10+USART3_RxBuffer[8]-0x30; //计算命令字 YG_Cnt=MJ_Cnt; Clear_RxBuffer(); break; } default : { //命令错误 Send_Error(); Clear_RxBuffer(); break; } } break; } case 'S': { //系统相关命令 switch(tem) { case 1: { //系统软件复位 NVIC_SystemReset(); //系统软件复位 Clear_RxBuffer(); break; } case 2: { //读取系统当前运行时间 USART3_SendWorld=100; Clear_RxBuffer(); break; } case 3: {//用于接收上位机返回的信息,不处理 Clear_RxBuffer(); break; } default: { //错误,没此命令 Send_Error(); Clear_RxBuffer(); break; } } break; } default: { //命令错误 // Send_Error(); break; } } Communicate_Computer(); USART3_Flag &= 0x0F; //清标识位 USART3_RxCounter=0; //清零 USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); //开中断 } }