Serial port Arduino系列:反向7E1。可能的
我正在尝试与一个设备进行串行通信,它需要反转的七个数据位,甚至奇偶校验和一个停止位(7E1)串行(1200波特) 从数据表中: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的电平移位器),但如果这是唯一的方法,我会这样做
SDI-12
通信以每秒1200位的速度发送字符。每个字符有1个起始位、7个数据位(LSB优先)、1个偶数奇偶校验位和1个停止位(低电平或反向逻辑电平):
所有SDI-12
命令和响应在数据行上必须遵循以下格式。命令和响应前面都有地址,并以回车换行组合终止
串行或软件串行库是否可以实现这一点?我试图避免额外的硬件(除了3.3V的电平移位器),但如果这是唯一的方法,我会这样做
我已经看到SoftwareSerial可以做反转,Serial可以做7E1,但我找不到两者是否都可以
我有权访问a(R2)和(R3)
这是我想与之通信的设备:这是解释协议的文档。第6页讨论了SDI的实现。我不熟悉Arduino,但是SDI-12物理层与标准TTL级别相反-可能有两个原因:
如果你对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
}