#include "sdi12.h" #include "bsp.h" Sdi_Fram_Record_Struct Sdi_Fram_Record_Structs; /***********************/ //函数名称: Diable_Usart3_TX(void) //功能复位串口:PB10作为普通IO口使用 //输入参数: 无 void Diable_Usart1_SDI(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_DeInit(USART1); //复位串口1 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); //GPIOB时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_ResetBits(GPIOB,GPIO_Pin_6); //GPIO_SetBits(GPIOB,GPIO_Pin_7); } /***********************/ //函数名称: Enable_Usart3_TX(void) //功能 :初始化串口3 //输入参数: baund,串口波特率 void Enable_Usart1_SDI(void) { USART1_SDI_Configuration(1200); } /***********************/ //函数名称: Break_Sdi_Sensor(void) //功能 :发送break命令 //输入参数: 无 void Break_Sdi_Sensor(void) { Enable_SdiTX; GPIO_ResetBits(GPIOB,GPIO_Pin_6);//出现俩? delay_ms(20); GPIO_SetBits(GPIOB,GPIO_Pin_6); } void Sdi_StartMeasure(void) { u8 i=0; char temp_sdi[5]={'\0'}; for(i=0;i<9;i++) { memset(temp_sdi,0,5); sprintf(temp_sdi,"%d%s",i,"M!"); Diable_Usart1_SDI(); Break_Sdi_Sensor();// 发送空号和传号 Enable_Usart1_SDI(); u1_printf("%s",temp_sdi); delay_ms(8); Enable_SdiRX; delay_ms(500); } /* Diable_Usart1_SDI(); Break_Sdi_Sensor();// 发送空号和传号 Enable_Usart1_SDI(); u1_printf("0M!"); delay_ms(8); Enable_SdiRX; 可正常发送 */ } char Sdi_readaddress(void) { char *str; osMutexAcquire(SDI_MutexID,osWaitForever); USART_RS232_DEinit(); Enable_SDI_RS232=0; Diable_Usart1_SDI(); USART1_SDI_CLR_RXBuf(); Break_Sdi_Sensor();// 发送空号和传号 Enable_Usart1_SDI(); u1_printf("%s","?!"); delay_ms(8); Enable_SdiRX; delay_ms(500); osMutexRelease(SDI_MutexID); if((str=strstr(USART1_SDI_RX_BUF,"\r\n")) !=NULL) { str--; return str[0]; } return 0x7f; } void Sdi_chanegadd(char a,char b) { char tempadd_sdi[10]={'\0'}; osMutexAcquire(SDI_MutexID,osWaitForever); sprintf(tempadd_sdi,"%c%c%c%c",a,'A',b,'!'); USART_RS232_DEinit(); Enable_SDI_RS232=0; Diable_Usart1_SDI(); USART1_SDI_CLR_RXBuf(); Break_Sdi_Sensor();// 发送空号和传号 Enable_Usart1_SDI(); u1_printf("%s",tempadd_sdi); delay_ms(8); Enable_SdiRX; delay_ms(500); osMutexRelease(SDI_MutexID); } //单个传感器测量,判断是否有数据返回 u8 Sdi_Readone(char add) { char temp_sdi[5]={'\0'}; char *subStringP; char *subStringN; USART1_SDI_CLR_RXBuf(); memset(temp_sdi,0,5); sprintf(temp_sdi,"%c%s",add,"D0!"); USART1_SDI_CLR_RXBuf(); Diable_Usart1_SDI(); Break_Sdi_Sensor();// 发送空号和传号 Enable_Usart1_SDI(); u1_printf("%s",temp_sdi); delay_ms(8); Enable_SdiRX; delay_ms(500); subStringP=strstr(USART1_SDI_RX_BUF,"+"); subStringN=strstr(USART1_SDI_RX_BUF,"-"); if((subStringP!=NULL)|(subStringN!=NULL)) return 0; else return 1; } //多个传感器测量 void Sdi_Read(void) { u8 i=0; char temp_sdi[5]={'\0'}; for(i=0;i<9;i++) { USART1_SDI_CLR_RXBuf(); memset(temp_sdi,0,5); sprintf(temp_sdi,"%d%s",i,"D0!"); USART1_SDI_CLR_RXBuf(); Diable_Usart1_SDI(); Break_Sdi_Sensor();// 发送空号和传号 Enable_Usart1_SDI(); u1_printf("%s",temp_sdi); delay_ms(8); Enable_SdiRX; delay_ms(500); Sdi_Par(i); } } //解析SDI数据 void Sdi_Par(u8 add) { char *subStringP; char *subStringN; char *subString; char *subStringNext; char pos1_data[10],pos2_data[10],pos3_data[10]; Sdi_Fram_Record_Structs.Flag_finish_DATA=0; if(strstr(USART1_SDI_RX_BUF,"\r\n"))//数据接收完成 { memset(pos1_data,0,10); memset(pos2_data,0,10); memset(pos3_data,0,10); /***********判断三个参数的±*************/ subStringP=strstr(USART1_SDI_RX_BUF,"+"); subStringN=strstr(USART1_SDI_RX_BUF,"-"); if(subStringP>subStringN)//POS1 { subString=subStringP; }else { //-在前 subString=subStringN; } subStringP=strstr(subString+1,"+"); subStringN=strstr(subString+1,"-"); if(subStringP>subStringN)////POS2 { subStringNext=subStringP; }else { //-在前 subStringNext=subStringN; } memcpy(pos1_data,subString,subStringNext-subString);//获取位置1数据 subString=subStringNext; subStringP=strstr(subString+1,"+"); subStringN=strstr(subString+1,"-"); if(subStringP>subStringN)////POS3 { subStringNext=subStringP; }else { //-在前 subStringNext=subStringN; } memcpy(pos2_data,subString,subStringNext-subString);//获取位置2数据 subString=subStringNext; subStringNext=strstr(subString,"\r\n"); memcpy(pos3_data,subString,subStringNext-subString);//获取位置3数据 /****************************/ // subStringP=strstr(USART1_SDI_RX_BUF,"+"); // subStringN=strstr(USART1_SDI_RX_BUF,"-"); // if(subStringP>subStringN)//+在前 // { // subString=subStringP; // }else // { // //-在前 // subString=subStringN; // } // subStringNext=strstr(subString,"\r\n"); switch (add) { // case 0: memcpy(Sdi_Fram_Record_Structs.Ch1_RX_BUF, subString, subStringNext - subString);break; //获取传感器0数据 // case 1: memcpy(Sdi_Fram_Record_Structs.Ch2_RX_BUF, subString, subStringNext - subString); break;//获取传感器1数据 // case 2: memcpy(Sdi_Fram_Record_Structs.Ch3_RX_BUF, subString, subStringNext - subString);break; //获取传感器2数据 // case 3: memcpy(Sdi_Fram_Record_Structs.Ch4_RX_BUF, subString, subStringNext - subString);break; //获取传感器3数据 // case 4: memcpy(Sdi_Fram_Record_Structs.Ch5_RX_BUF, subString, subStringNext - subString);break; //获取传感器4数据 // case 5: memcpy(Sdi_Fram_Record_Structs.Ch6_RX_BUF, subString, subStringNext - subString);break; //获取传感器5数据 // case 6: memcpy(Sdi_Fram_Record_Structs.Ch7_RX_BUF, subString, subStringNext - subString);break; //获取传感器6数据 // case 7: memcpy(Sdi_Fram_Record_Structs.Ch8_RX_BUF, subString, subStringNext - subString);break; //获取传感器7数据 // case 8: memcpy(Sdi_Fram_Record_Structs.Ch9_RX_BUF, subString, subStringNext - subString);break; //获取传感器8数据 // default:break; case 0: sprintf(Sdi_Fram_Record_Structs.Ch1_RX_BUF, "%s,%s,%s", pos1_data,pos2_data,pos3_data);break; //获取传感器0数据 case 1: sprintf(Sdi_Fram_Record_Structs.Ch2_RX_BUF, "%s,%s,%s", pos1_data,pos2_data,pos3_data); break;//获取传感器1数据 case 2: sprintf(Sdi_Fram_Record_Structs.Ch3_RX_BUF, "%s,%s,%s", pos1_data,pos2_data,pos3_data);break; //获取传感器2数据 case 3: sprintf(Sdi_Fram_Record_Structs.Ch4_RX_BUF, "%s,%s,%s", pos1_data,pos2_data,pos3_data);break; //获取传感器3数据 case 4: sprintf(Sdi_Fram_Record_Structs.Ch5_RX_BUF, "%s,%s,%s", pos1_data,pos2_data,pos3_data);break; //获取传感器4数据 case 5: sprintf(Sdi_Fram_Record_Structs.Ch6_RX_BUF, "%s,%s,%s", pos1_data,pos2_data,pos3_data);break; //获取传感器5数据 case 6: sprintf(Sdi_Fram_Record_Structs.Ch7_RX_BUF, "%s,%s,%s", pos1_data,pos2_data,pos3_data);break; //获取传感器6数据 case 7: sprintf(Sdi_Fram_Record_Structs.Ch8_RX_BUF, "%s,%s,%s", pos1_data,pos2_data,pos3_data);break; //获取传感器7数据 case 8: sprintf(Sdi_Fram_Record_Structs.Ch9_RX_BUF, "%s,%s,%s", pos1_data,pos2_data,pos3_data);break; //获取传感器8数据 default:break; } Sdi_Fram_Record_Structs.Flag_finish_DATA=1; } } void sdi12_buf_clear(void) { memset(Sdi_Fram_Record_Structs.Ch1_RX_BUF,0,sizeof(Sdi_Fram_Record_Structs.Ch1_RX_BUF)); memset(Sdi_Fram_Record_Structs.Ch2_RX_BUF,0,sizeof(Sdi_Fram_Record_Structs.Ch2_RX_BUF)); memset(Sdi_Fram_Record_Structs.Ch3_RX_BUF,0,sizeof(Sdi_Fram_Record_Structs.Ch3_RX_BUF)); memset(Sdi_Fram_Record_Structs.Ch4_RX_BUF,0,sizeof(Sdi_Fram_Record_Structs.Ch4_RX_BUF)); memset(Sdi_Fram_Record_Structs.Ch5_RX_BUF,0,sizeof(Sdi_Fram_Record_Structs.Ch5_RX_BUF)); memset(Sdi_Fram_Record_Structs.Ch6_RX_BUF,0,sizeof(Sdi_Fram_Record_Structs.Ch6_RX_BUF)); memset(Sdi_Fram_Record_Structs.Ch7_RX_BUF,0,sizeof(Sdi_Fram_Record_Structs.Ch7_RX_BUF)); memset(Sdi_Fram_Record_Structs.Ch8_RX_BUF,0,sizeof(Sdi_Fram_Record_Structs.Ch8_RX_BUF)); memset(Sdi_Fram_Record_Structs.Ch9_RX_BUF,0,sizeof(Sdi_Fram_Record_Structs.Ch9_RX_BUF)); } void sdi12_process(void) { //u5_printf("start measure......\r\n"); osMutexAcquire(SDI_MutexID,osWaitForever); //USART_DeInit(USART1); Diable_Usart1_SDI(); USART_RS232_DEinit(); Enable_SDI_RS232=0; sdi12_buf_clear();//清除数组 Sdi_StartMeasure();//启动测量 delay_ms(500); Sdi_Read();//读取数据 osMutexRelease(SDI_MutexID); // u5_printf(" measure end......\r\n"); }