Files
SM-1000M/IAPV1.1/Driver/sdi12/sdi12.c
2026-04-23 10:50:18 +08:00

311 lines
8.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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");
}