Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Serial port Arduino系列:反向7E1。可能的_Serial Port_Arduino_Sdi_Sdi 12 - Fatal编程技术网

Serial port Arduino系列:反向7E1。可能的

Serial port Arduino系列:反向7E1。可能的,serial-port,arduino,sdi,sdi-12,Serial Port,Arduino,Sdi,Sdi 12,我正在尝试与一个设备进行串行通信,它需要反转的七个数据位,甚至奇偶校验和一个停止位(7E1)串行(1200波特) 从数据表中: SDI-12通信以每秒1200位的速度发送字符。每个字符有1个起始位、7个数据位(LSB优先)、1个偶数奇偶校验位和1个停止位(低电平或反向逻辑电平): 所有SDI-12命令和响应在数据行上必须遵循以下格式。命令和响应前面都有地址,并以回车换行组合终止 串行或软件串行库是否可以实现这一点?我试图避免额外的硬件(除了3.3V的电平移位器),但如果这是唯一的方法,我会这样做

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

从数据表中:

SDI-12
通信以每秒1200位的速度发送字符。每个字符有1个起始位、7个数据位(LSB优先)、1个偶数奇偶校验位和1个停止位(低电平或反向逻辑电平):

所有SDI-12
命令和响应在数据行上必须遵循以下格式。命令和响应前面都有地址,并以回车换行组合终止

串行或软件串行库是否可以实现这一点?我试图避免额外的硬件(除了3.3V的电平移位器),但如果这是唯一的方法,我会这样做

我已经看到SoftwareSerial可以做反转,Serial可以做7E1,但我找不到两者是否都可以

我有权访问a(R2)和(R3)


这是我想与之通信的设备:这是解释协议的文档。第6页讨论了SDI的实现。

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

  • 由于怠速电压为0V,因此待机功率较低(由于典型SDI-12传感器中的标称下拉电阻器)
  • 它使用标准RS-232串行端口方便了简单的总线“嗅探”
  • 缺少5V IO引脚的位碰撞-是的,如果使用标准微控制器UART,您将需要一个外部逆变器(或2个)和一个3态缓冲器。可能需要电平转移,具体取决于您的硬件

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


    如果你对SDI-12固件的开发很认真,你可能会想投资一个。对的彻底研究是必要的。

    晚一点…但晚一点总比不做强

    事实上,我刚刚编写了一个库来实现这一点(实际上,包括传感器……因此它应该与所包含的示例一起工作)

    (阿杜伊诺图书馆)

    #包括//https://github.com/joranbeasley/SDISerial (阿杜伊诺图书馆)
    #包括
    #定义数据_引脚2
    SDISerial连接(数据_引脚);
    char output_buffer[125];//仅用于uart打印
    字符tmp_缓冲区[4];
    字符传感器信息[]
    //初始化变量
    无效设置(){
    connection.begin();
    Serial.begin(9600);//因此我们可以打印到标准uart
    //小延迟,让传感器完成启动工作
    延迟(3000);//3秒应该足够了
    char*sensor\u info=connection.sdi\u query(“0I!”,1000);//获取地址0的传感器信息
    }
    //主回路
    void循环(){
    //打印到uart
    println(“开始命令:?M!”);
    //向总线上的第一个设备发送测量查询(M)
    char*resp=connection.service_请求(“0M!”,“0D0!”);//从地址0获取度量值
    sprintf(输出缓冲区,“RECV:%s”,resp?resp:“未收到响应!!”;
    Serial.println(输出缓冲区);
    延迟(10000);//下次读取前睡眠10秒
    }
    
    这是任何串行通信的标准。你试过吗?它是0-3V,不是+-3V,我想这意味着它不是RS232?@HansPassant,来自SDI-12的维基百科条目:“使用5V逻辑电平的数据信号与RS-485或RS-232没有相似之处,尽管时间是相似的。”我发布这个链接是为了说明反向逻辑级别是标准的。谢谢你们两位看这个。我已经用我正在处理的细节的链接更新了主要帖子。我的问题是,他们是在说“反向逻辑级别”是反向SDI还是反向TTL?这可能只是我感到困惑(我不太会使用串行接口,其他大部分都是I2C或SPI)并且正常的串行库具有正确的奇偶校验和停止设置就足够了。我不想尝试,直到我确定我不会发送错误的命令/电压来损坏设备。好吧,如果“SoftwareSerial”是一个位爆炸串行端口实现,平台是5V,它应该是可能的(通过一些调整,以共享一个单一的IO引脚)。
    #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
    }