Exactly! But not const 256. Any number with length up to 3. I.e. 1-999
I am posting below a two UNOs setup for communication over SUART-UART Ports. UNO-1 sends 3-digit integer ID using Intel-Hex Frame over SUART Port. UNO-2 receives the frame using UART Port; it extracts the ID number from the received frame, saves it in array, and shows it on Serial Monitor.
You may find it useful!
A: Connection Diagram between UNO-1 and UNO-2
Fig-1
B: Example ID 256 has been sent using in Intel-Hex Frame
Fig-2
C: Example ID has been received over Intel-Hex Frame
Fig-3
D: Transmitter (UNO-1) Codes
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); //SRX and STX of UNO-1
byte frameArray[9]; //totl 9-byte in the Intel-Hex Frame
byte dataArray[3] = {0x02, 0x05, 0x06}; //for id = 256
void setup()
{
Serial.begin(9600); // Serial port to computer
mySerial.begin(9600); // Serial port to HC12
}
void loop()
{
buildIntelHexFrame(); //INtel-hex Frame as byte
sendIntelHexFrame(); //send Intel every digit of Frame as ASCII codes
while(1) //wait for ever
;
}
void sendIntelHexFrame()
{
mySerial.write(frameArray[0]); //send : start of frame
Serial.print((char)frameArray[0]);
for(int i = 1; i<9; i++)
{
byte x = frameArray[i];
byte x1 = x;
x1 = x1>>4;
if (x1 <=9)
{
x1 = x1+0x30;
mySerial.write(x1);
Serial.write(x1);
}
else
{
mySerial.write(x1+0x37);
Serial.write(x1+0x37);
}
//--------------------------------
x = frameArray[i];
x = x & 0x0F;
if (x <=9)
{
x = x+0x30;
mySerial.write(x);
Serial.write(x);
}
else
{
mySerial.write(x+0x37);
Serial.write(x+0x37);
}
}
Serial.println();
}
void buildIntelHexFrame() //Intel-Hex Frame (fields a, b, c, d, e, f)
{
frameArray[0] = 0x3A; //field-a (:) Start of a of a frame
frameArray[1] = 03; //filed-b = number of information byte inn field-e
frameArray[2] = 0x20; //field-c EEPROM buffer address - upper byte
frameArray[3] = 0x00; //EEPROM bufferaddress - lower byte
frameArray[4] = 0x00; //field-d Not End-of-File Marker (01 = EOF)
//-------------------
for (int i=5, j=0; i<8, j<3; i++, j++)//filed-e information byte 3
{
frameArray[i] = dataArray[j];
}
frameArray[8] = chkSum();
}
byte chkSum()
{
byte sum=0;
for (int k = 1; k<8 ; k++)
{
sum += frameArray[k];
}
sum =~sum;
sum++;
return sum;
}
E: Received Side (UNO-2) Codes
//#include <SoftwareSerial.h>
//SoftwareSerial mySerial(10, 11); //SRX and stx OF uno-2
bool flag = false;; //Frame synchronizer has not come
byte frameArray[19]; //
byte x, y, y1;
int i = 0;
int j = 0;
byte idData[3]; //lower-most array elemnet contains lower-most byte
void setup()
{
Serial.begin(9600); // Serial port to computer
// mySerial.begin(9600);
}
void loop()
{
if (i == 17) //complete frame is received 8-byte x 2 = 16 + extra post i++ = 17
{
buildAndShowIdNumber(); //nuumber in: z, p, and myData[] of union{}
i = 0;
flag = false;
i = 0;
j = 0;
}
}
void buildAndShowIdNumber()
{
Serial.println();//write(frameArray[18]);
for (i = 9, j = 0; i < 15, j < 3; i++, j++) //6-character 3-byte
{
y = frameArray[i];
if (y < 0x41)
{
y = y & 0x0F;
y = y << 4;
}
else
{
y = y - 0x37;
y = y << 4;
}
//-------------------
i = i + 1; //i++;
y1 = frameArray[i];
if (y1 < 0x41)
{
y1 = y1 & 0x0F;
}
else
{
y1 = y1 - 0x37;
}
//------------------------
y = y | y1; //byte formed 02 05 06
idData[j] = y; //received ID in idData[3] array as 02 05 06
}
Serial.print(idData[0]);
Serial.print(idData[1]);
Serial.print(idData[2]);
Serial.println();
}
void serialEvent()
{
if (flag == true)
{
while (Serial.available())
{ // UNO-2 has received rame synchronizer
x = Serial.read();
Serial.write(x); // Send the data to Serial monitor
frameArray[i] = x; //save in array
i++; //index remains incremented by 1
}
}
else
{
byte s = Serial.read();
if ( s != 0x3A)
{
flag = false;
}
else
{
if ( s == 0x3A)
{
Serial.write(s);
flag = true;
i++; //index incremented
}
}
}
}
BTW: UNO-2 has used Hardware Serial (UART) Port. So, please remove the jumper wires from DPin-0 and DPin-1 while uploading sketch into UNO-2.