如何在stm32上实现以sdi-12的协议通信?

2019-07-21 06:59发布

有什么方案么,最好有部分代码,谢谢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
5条回答
A富平柿饼
2019-07-21 17:06
void ZMDQ()
{
  //唤醒传感器采集地址
  do{
   SDI_TX_Flag=0x31;   
   Break_SDI_Sensor();
   Find_add();
   SDI_addr_Flag=0x31;
   delay_ms(40);
   
   }while(SDI_addr_Flag==0x31);
    SID_12_Receive();
//开始测量
    SDI_TX_Flag=0x31;
    Begin_test_aM();
    delay_ms(80);
    SID_12_Receive();
//接收测量数据
    Getdata_Sensor=0x31;
    do{
      delay_ms(1000);
      wait_Gather=wait_Gather-500;
      }while(wait_Gather>0);
    delay_ms(100);//等待返回字符0
    SID_12_Receive();
    delay_ms(40);
    if(Getdata_Sensor==0x30)
    {
      SDI_TX_Flag=0x31;
      Gather_data();
      delay_ms(300);
      SID_12_Receive();
      delay_ms(140);
    }
}

/*************************************
SDI-12唤醒传感器
首先向总线上写高电平至少12MS
然后拉低8MS
于2017.2.21测试完成。
*************************************/
void Break_SDI_Sensor(void)
{

  P3SEL &= ~TXD0;
  P3DIR |= TXD0;           //设置TXD为输出
  P3OUT|=TXD0;
  P1OUT=0X00;
  delay_ms(10);
  P3OUT&=~TXD0;
  delay_ms(13);
  P3OUT|=TXD0;
  delay_ms(8);
  Delay1us(340);
}

/**************************
传感器地址查询
于2017.2.21测试完成。
***************************/
void Find_add()//查找传感器地址?! 这个命令只能用于下连一个传感器的情况
{

  P3SEL |=TXD0;  //设置发送为串口模式
  Send_Datas(F_add,2); // find adress
  delay_ms(5);
  P3SEL ^=TXD0;
  SDI_TX_Flag=0x30;
  P3OUT |= BIT4;
  delay_ms(1);
  P1OUT=0x20; // Tx disable
}

/**************************
测量命令
与2017.02.22测试完成
***************************/
void Begin_test_aM() //开始测量命令 aM!

{
  P1OUT=0x00; //Tx enable
  P3SEL |=TXD0;  //设置发送为串口模式
  if(AM_Flag==0x31)
    {
    B_test_aMx[0] = Sensor_Add; //传感器地址
    B_test_aMx[2] = RS_232_RX_BUF[2];
    Send_Datas(B_test_aMx,4); // 测量命令
    }
else
    {
    B_test_aM[0]= Sensor_Add;
    Send_Datas(B_test_aM,3);
    }
  delay_ms(5);
  delay_ms(1);
  P1OUT=0x20; // Tx disable
  SDI_TX_Flag=0x30;
  AM_Flag=0x30;
}

/**************************
发送采集
***************************/
void Gather_data() // 得到数据 0Dx!

{
  G_data[0] = Sensor_Add; //传感器地址
  G_data[2]=RS_232_RX_BUF[2];
  P1OUT=0x00; //Tx enable
  Delay1(500);
  Send_Datas(G_data,4); // 测量命令
  delay_ms(5);; //等待发送完成
  P1OUT=0x20; // Tx disable
  SDI_TX_Flag=0x30;

}

此为SDI-12顺序命令流畅,最基础部分。我个人开源贡献给大家。
需求源程序完整代码,请联系我百度账户。
源程序基本功RS232 TO SDI-12 命令识别转发,兼容维萨拉传感器。
仅供参考

一周热门 更多>