Çözüldü1.42K görüntülenmeLoraLora
0

Merhaba, 2 gun once E22 geliştirme seti aldım. sorum şu. entes analizorden değer okuyabiliyorum fakat 2 tane yada daha fazla modbus sorgusu yapmam gerekıyor. kodda nasıl bir değişlik yapmam gerekıyor.

#include <SoftwareSerial.h>
#include "LoRa_E32.h"
/*-----( Declare Constants and Pin Numbers )-----*/
#define SSerialRX       8  //Serial Receive pin
#define SSerialTX       9  //Serial Transmit pin
 
#define SSerialTxControl 2   //RS485 Direction control
 
#define RS485Transmit    HIGH
#define RS485Receive     LOW
 
#define Pin13LED         13
 
/*-----( Declare objects )-----*/
SoftwareSerial RS485Serial(SSerialRX, SSerialTX); // RX, TX
 
SoftwareSerial mySerial(10, 11);
LoRa_E32 e32ttl(&mySerial);
struct Signal {
  char type[15] = "Fixaj.com";
  byte gun[3];
} data;
 
/*-----( Declare Variables )-----*/
int byteReceived;
int a;
String ph_hexa, ph_hexa_hight_byte, ph_hexa_low_byte, ph_hexa_value;
byte request [] = {
  0x01,
  0x03,
  0x17,
  0x70,
  0x00,
  0x01,
  0x80,
  0x65
};
 
/*
   şimdi burda sorgu 01 03 17 70 00 01 65 80
   entes marka mpr47s-d modelinin register tablosunda en sonda ayın gününü hesaplama sorgusu
   yukarıda dikkat edersen herşey normal taki, crc değerine gelene kadar.
   CRC değerinin sırasını ters yazacan, önce 80 sonra 65 değerini yazmalısın
 
    0x01, slave adersi
    0x03, okuma fonksiyonunu çağır
    0x17, 1770 adres ayın gününü veren register
    0x70,
    0x00, okunacak veri boyutu biz sadece 1 tane istediğimiz için 0001, hıgh ve low gibi düşün
    0x01,
    0x80,  crc değeri normalde 6580 ama burada ters yazacan
    0x65
    crc değerini otomatik hesaplma <a href="https://www.lammertbies.nl/comm/info/crc-calculation">https://www.lammertbies.nl/comm/info/crc-calculation</a>
*/
 
 
void setup()   /****** SETUP: RUNS ONCE ******/
{
  // Start the built-in serial port, probably to Serial Monitor
  Serial.begin(9600);
  e32ttl.begin();
  delay(500);
 
  Serial.println("Fixaj.com");
 
  pinMode(Pin13LED, OUTPUT);
  pinMode(SSerialTxControl, OUTPUT);
 
  digitalWrite(SSerialTxControl, RS485Receive);  // Init Transceiver
 
  // Start the software serial port, to another device
  RS485Serial.begin(9600);   // set the data rate
 
}//--(end setup )---
 
 
void loop()   /****** LOOP: RUNS CONSTANTLY ******/
{
 
  RS485Serial.listen();
  if (RS485Serial.available())  //Look for data from other Arduino
  {
    Serial.print("Response: ");
    for (int i = 0; i <= 6; i++) {
      byteReceived = RS485Serial.read();    // Read received byte
 
      ph_hexa = String(byteReceived, HEX);
 
      // index 3 = high byte
      if (i == 3)
      {
        ph_hexa_hight_byte =   ph_hexa;
      }
 
      // index 4 = low byte
      if (i == 4)
      {
        ph_hexa_low_byte =   ph_hexa;
 
        ph_hexa_value = ph_hexa_hight_byte + ph_hexa_low_byte;
 
        a = StrToHex(ph_hexa_value.c_str());
 
        Serial.println(a);// Show on Serial Monitor
 
        mySerial.listen();
 
        struct Signal  {
          char type[15] = "entes";
          byte gun[3];
        } data2;
 
        *(int*)(data2.gun) = a;
 
 
        ResponseStatus rs = e32ttl.sendFixedMessage(0, 63, 23, &data2, sizeof(Signal));
        Serial.println(rs.getResponseDescription());
         
      }
      Serial.print(" ");
    }
    /*
      Serial.println(ph_hexa);
      ph_hexa = "";
    */
    Serial.println();
  }
  else
  {
    Serial.println();
    Serial.print("Request: ");
    digitalWrite(SSerialTxControl, RS485Transmit);  // Init Transceiver
    for (int i = 0; i < 8; i++) {
      Serial.print(request[i], HEX);
      RS485Serial.write((byte)request[i]);
    }
    Serial.println();
    digitalWrite(SSerialTxControl, RS485Receive);  // Init Transmit
  }
  delay(1000);
 
}
 
int StrToHex(char str[])
{
  return (int) strtol(str, 0, 16);
}

Soru yeni cevaplara kapalıdır.
Mehmet En iyi cevap olarak seçildi Eylül 20, 2022
0

cevap vermenize gerek kalmadı çözüm basitmiş.

Mehmet Yeni yorum gönderildi Eylül 20, 2022

Keşke cevabı yazsaydın belki senden sonra bir arkadaşın ihtayacı olurdu.