arduino - Arduino Mega 和 RS485 Modbus 传感器
问题描述
我正在尝试使用 RS485 通信将土壤传感器连接到 arduino mega,但我无法让它工作。我正在使用 SparkFun RS485 分线器:https ://www.sparkfun.com/products/10124 我已将 TX 连接到引脚 18,将 RS 连接到引脚 19,将 RTS 连接到引脚 8。我尝试调整代码此处:https ://www.youtube.com/watch?v=tBw15SfmuwI使用传感器的制造商默认设置:
- Modbus 地址固定为 0
- 通讯配置为9600,N,8,1(9600bps,无校验位,8个数据位,1个停止位)</li>
- 通讯协议是 Modbus-RTU 而我需要读取的地址是 0x0000-0x0002。但是,当我打开串行监视器“?”时,我得到随机字符作为输出,知道为什么吗?对于读取传感器输出的任何帮助,我将不胜感激。这是我使用的代码:
#include <ModbusMaster.h>
#define MAX485_DE 8
#define MAX485_RE_NEG 8
ModbusMaster node;
void preTransmission () {
digitalWrite(MAX485_RE_NEG, 1);
digitalWrite(MAX485_DE, 1);
}
void postTransmission () {
digitalWrite(MAX485_RE_NEG, 0);
digitalWrite(MAX485_DE, 0);
}
void setup() {
pinMode(MAX485_RE_NEG, OUTPUT);
pinMode(MAX485_DE, OUTPUT);
digitalWrite(MAX485_RE_NEG, 0);
digitalWrite(MAX485_DE, 0);
Serial.begin(9600);
node.begin(0,Serial);
node.preTransmission(preTransmission);
node.postTransmission(postTransmission);
}
void loop() {
uint8_t resultMain;
resultMain = node.readInputRegisters(0x0000, 3);
if (resultMain == node.ku8MBSuccess) {
Serial.println("-------");
Serial.print("Temp: ");
Serial.println(node.getResponseBuffer(0x00) /100);
Serial.print("VWC: ");
Serial.println(node.getResponseBuffer(0x01) /100);
Serial.print("EC: ");
Serial.println(node.getResponseBuffer(0x02) /100);
}
}
解决方案
arduino mega 有 3 个串口:
- 串行
- 序列号 1
- 序列号 2
您可以将其视为 Serial 为 Serial0(从不写入零)。这个端口硬连线到 arduino mega 上的 USB 端口。
您的 RS485 分线板连接到 Serial1。您可能会注意到在 18 和 19 针脚旁边的 mega 上的丝网印刷表示 TX1 和 RX1。
因此,当您在此行初始化节点时:
node.begin(0,Serial);
你应该通过它 Serial1 而不是 Serial
例如
node.begin(0,Serial1);
推荐阅读
- fiware - 如何开始使用 FIWARE?
- javascript - 在 Express 中回复两次
- javascript - Javascript - 深度过滤数组
- java - 如何避免使用 jsp 从数据库中打印重复名称?
- apache-spark - 如何识别正在运行的 JVM 是 Apache Spark 中的 Driver 还是 Executor
- python - 使用python解析文本文件并设计报告
- asp.net - SmartStore 应用程序上我的服务器上的编译错误
- c# - 将子实体添加到数据库并将它们分配给数据库 Entity Framework Core 中的父对象
- swift - swift playground 显示 uiview 并不停循环
- app-inventor - 摇动手机时图像没有变化