SWDesk/Firmware
[Arduino] JSON Transfer through RS-485
bizmaker
2025. 3. 12. 05:30
ESP32Nano 2개 사이를 RS-485 방식으로 데이터를 송신 및 수신하고자 함.
원본 데이터의 형식은 JSON임.
[송신측 코드]
* Serial2.begin(9600) 사용 가능
#include <HardwareSerial.h>
#include <ArduinoJson.h>
#define DE_RE 2 // RS-485 모듈 DE & RE 핀
HardwareSerial RS485Serial(1); // UART1 사용 (TX = GPIO17, RX = GPIO16)
void setup() {
pinMode(DE_RE, OUTPUT);
digitalWrite(DE_RE, HIGH); // 송신 모드 활성화
RS485Serial.begin(9600, SERIAL_8N1, 16, 17); // RX = GPIO16, TX = GPIO17
Serial.begin(115200);
}
void loop() {
StaticJsonDocument<200> jsonDoc;
jsonDoc["temperature"] = 22.5;
jsonDoc["humidity"] = 55;
jsonDoc["status"] = "OK";
char jsonString[200];
serializeJson(jsonDoc, jsonString);
// RS-485로 JSON 데이터 전송
digitalWrite(DE_RE, HIGH); // 송신 모드
RS485Serial.println(jsonString);
digitalWrite(DE_RE, LOW); // 수신 모드로 전환
Serial.print("Sent: ");
Serial.println(jsonString);
delay(1000);
}
[수신측 코드]
* Serial2.begin(9600) 사용 가능
#include <HardwareSerial.h>
#include <ArduinoJson.h>
#define DE_RE 2 // RS-485 모듈 DE & RE 핀
HardwareSerial RS485Serial(1); // UART1 사용 (TX = GPIO17, RX = GPIO16)
void setup() {
pinMode(DE_RE, OUTPUT);
digitalWrite(DE_RE, LOW); // 수신 모드 활성화
RS485Serial.begin(9600, SERIAL_8N1, 16, 17); // RX = GPIO16, TX = GPIO17
Serial.begin(115200);
}
void loop() {
if (RS485Serial.available()) {
String receivedData = RS485Serial.readStringUntil('\n'); // 데이터 수신
StaticJsonDocument<200> jsonDoc;
DeserializationError error = deserializeJson(jsonDoc, receivedData);
if (error) {
Serial.print("JSON Parsing Failed: ");
Serial.println(error.c_str());
return;
}
float temperature = jsonDoc["temperature"];
int humidity = jsonDoc["humidity"];
const char* status = jsonDoc["status"];
Serial.println("Received JSON Data:");
Serial.print("Temperature: "); Serial.println(temperature);
Serial.print("Humidity: "); Serial.println(humidity);
Serial.print("Status: "); Serial.println(status);
}
}
반응형