311 lines
8.8 KiB
C
311 lines
8.8 KiB
C
#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");
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|