首页 文章

Arduino序列:倒置7E1 . 可能?

提问于
浏览
3

我正在尝试与SDI-12设备进行串行通信,它需要反转七个数据位,偶校验和一个停止位(7E1)串行,1200波特 .

从数据表:

SDI-12通信以每秒1200位的速率发送字符 . 每个字符有1个起始位,7个数据位(LSB优先),1个偶校验位和1个停止位(低电平有效或反向逻辑电平):所有SDI-12命令和响应必须符合数据线上的以下格式 . 命令和响应都以地址开头,并由回车换行组合终止 .

这可能与Serial或SoftwareSerial库有关吗?我试图避免额外的硬件(超过一个转换器到3.3 V),但如果这是唯一的方法,我会这样做 .

我已经看到SoftwareSerial可以做倒置,而Serial可以做7E1,但我找不到两者是否可以做到 .

我可以访问Arduino Mega(R2)和Arduino Uno(R3) .

这是我想要与之通信的设备:http://www.decagon.com/products/sensors/soil-moisture-sensors/gs3-soil-moisture-temperature-and-ec/这里,http://www.decagon.com/assets/Uploads/GS3-Integrators-Guide.pdf是解释协议的文档 . 第6页讨论了SDI的实现 .

2 回答

  • 1

    我不熟悉Arduino,但SDI-12物理层与标准TTL电平相反 - 可能有两个原因:

    • 由于空闲电压为0V,因此可降低待机功耗(由于典型SDI-12传感器中的标称下拉电阻) .

    • 使用标准RS-232串口简化总线'sniffing' .

    没有位冲击5V IO引脚 - 是的,如果使用标准微控制器UART,您将需要一个外部反相器(或2)和一个3态缓冲器 . 可能需要电平转换,具体取决于您的硬件 .

    大拇指向维基百科条目 - SDI-12使用完全标准的UART位时序(非常像RS-232),只是不同的信号电平(0 - 5V);见第2点 . 但是,存在特定的中断序列和严格的时序要求,这使得固件开发更加困难 .

    如果您认真对待SDI-12固件开发,您可能需要投资SDI-12 Verifier . 对specification的彻底研究至关重要 .

  • 1

    有点晚了......但迟到总比没有好

    我实际上只是编写了一个库(实际上恰好包括传感器...所以它应该与包含的例子完全一致)

    https://github.com/joranbeasley/SDISerial(Arduino图书馆)

    #include <SDISerial.h> //https://github.com/joranbeasley/SDISerial (Arduino Library)
    #include <string.h>
    #define DATA_PIN 2
    SDISerial connection(DATA_PIN);
    char output_buffer[125]; // just for uart prints
    char tmp_buffer[4];
    char sensor_info[]
    //initialize variables
    void setup(){
          connection.begin();
          Serial.begin(9600);//so we can print to standard uart
          //small delay to let the sensor do its startup stuff
          delay(3000);//3 seconds should be more than enough
          char* sensor_info = connection.sdi_query("0I!",1000); // get sensor info for address 0
    }
    
    //main loop
    void loop(){
        //print to uart
        Serial.println("Begin Command: ?M!");
    
        //send measurement query (M) to the first device on our bus
        char* resp = connection.service_request("0M!","0D0!");//Get Measurement from address 0
    
    
        sprintf(output_buffer,"RECV: %s",resp?resp:"No Response Recieved!!");
        Serial.println(output_buffer);
        delay(10000);//sleep for 10 seconds before the next read
    }
    

相关问题