I want to communicate with an RS485 Bus consisting of 5 Arduino Pro Minis as slaves and one Arduino Mega 2560 as Master. I found a great library for this.
According to the documentation provided by the author of library I can use:
ICSC icsc(1, 9600, 7); //ID, BaudRate, DEpin
But I also have to define a Serial port for ICSC to work with:
ICSC icsc(1, 9600, Serial1);
I cannot mix these two sentences. I mean I cannot define both DEpin and Serial port for the ICSC in one sentence. But I need it to be defined. I don't want to use Serial for that, which I need for Serial Monitor. I want to use Serial1 for this. What can I do? I couldn't find any updated documentation about this.
UPDATE:
I found out how to define Serial port and DEpin for ICSC. The problem is I cannot get an answer!
Here is Master code:
#include <ICSC.h>
ICSC icsc(Serial1, 1, 7); //Stream, ID, DEpin
void setup() {
Serial.begin(9600);
Serial1.begin(9600);
icsc.begin();
icsc.registerCommand('R', &showTemperature);
}
void loop() {
icsc.send(2, 'T', 0, NULL);
icsc.process();
}
void showTemperature() {
Serial.println("ACK");
}
And here is the Slave code:
#include <ICSC.h>
ICSC icsc(Serial, 2, 7); //Stream, ID, DEpin
String strAck = "ProMini2:ACK";
void setup() {
Serial.begin(9600);
icsc.begin();
icsc.registerCommand('T', &sendTemperature);
}
void loop() {
icsc.process();
}
void sendTemperature() {
icsc.send(1, 'R', sizeof(strAck) + 1, (char*)&strAck);
}
Assume that there is just one slave and one master. I tried this code but got no answer. Where is the error?
2 Answers 2
The documentation for the constructors is out of date (I am re-writing as we speak, and is now here).
The constructors in the header file are like this:
ICSC(Stream *d, uint8_t station);
ICSC(Stream &d, uint8_t station);
ICSC(Stream *d, uint8_t station, int depin);
ICSC(Stream &d, uint8_t station, int depin);
That means you need to provide the serial object as the first entry:
ICSC icsc(Serial1, 'A', 5);
You need to manually start the serial object before ICSC.
void setup() {
Serial1.begin(9600);
icsc.begin();
}
This change was made to enable support for software serial and other Stream based devices.
Addendum for your update:
- Don't spam the sending like you are. Send periodically, not constantly, or you will never be able to receive.
- You cannot use String objects like that.
- 1 and 2 aren't good choices of station IDs. Yes, they work, but not great, since 1 is the SOH character.
-
But what if i begin both Serial and Serial1 right after eachother ? Which one will be assigned to ICSC?Safa Dana– Safa Dana2017年12月14日 16:46:15 +00:00Commented Dec 14, 2017 at 16:46
-
Whichever one you assign to ICSC.Majenko– Majenko2017年12月14日 16:46:33 +00:00Commented Dec 14, 2017 at 16:46
-
I'll give it a try tomorrow and will let you know. Thx in advance.Safa Dana– Safa Dana2017年12月14日 16:51:14 +00:00Commented Dec 14, 2017 at 16:51
-
Can i use this constractors in current version of icsc which i'm using?Safa Dana– Safa Dana2017年12月14日 17:16:45 +00:00Commented Dec 14, 2017 at 17:16
-
That is the constructors for the version on Github.Majenko– Majenko2017年12月14日 17:17:17 +00:00Commented Dec 14, 2017 at 17:17
The documentation for the library notes a few different possible initialization methods:
ICSC.begin(stationId, baudRate);
ICSC.begin(stationId, baudRate, &SerialPort);
ICSC.begin(stationId, baudRate, &SerialPort, DEPin);
ICSC.begin(stationId, baudRate, DEPin);
So, if you need to define both a serial port and DE Pin, use the third option.
EDIT: Disregard this answer, as the library has changed initialization methods.
-
I tried that, but gives error: No overload method matches the (int, int, &, int) was found. Something like that :)Safa Dana– Safa Dana2017年12月14日 16:45:21 +00:00Commented Dec 14, 2017 at 16:45
-
That documentation is out of date.Majenko– Majenko2017年12月14日 16:56:47 +00:00Commented Dec 14, 2017 at 16:56