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
);
}
Keşke cevabı yazsaydın belki senden sonra bir arkadaşın ihtayacı olurdu.