Hi everyone!
I'm designing a particular project in which serial communication in very important.
I try to explain what the system does in a few words: the VB.NET program sends to Arduino a letter just to be recognized, then Arduino sends some data from sensors, the VB.NET program elaborates these data and sends Arduino two bytes. These two bytes represent the logic states that have to be written to 16 digital pins (one bit for each pin).
Now, Arduino recognizes the letter sent from the computer, the program receives data from Arduino correctly and creates the final two bytes perfectly, but here comes the problem!
Arduino receives the two bytes (I think), uses some bit masks and tries to write the obtained values to the digital pins, but these digital pins behave in a wrong way and I don't understand how they work!
Here is the VB.NET code for the specific part:
Dev16To9 = Dev16To9Array(7) * 128 + Dev16To9Array(6) * 64 + Dev16To9Array(5) * 32 + Dev16To9Array(4) * 16 + Dev16To9Array(3) * 8 + Dev16To9Array(2) * 4 + Dev16To9Array(1) * 2 + Dev16To9Array(0)
Dev8To1 = Dev8To1Array(7) * 128 + Dev8To1Array(6) * 64 + Dev8To1Array(5) * 32 + Dev8To1Array(4) * 16 + Dev8To1Array(3) * 8 + Dev8To1Array(2) * 4 + Dev8To1Array(1) * 2 + Dev8To1Array(0)
SerialPort1.Open()
SerialPort1.Write(Dev16To9)
SerialPort1.Write(Dev8To1)
Label4.Text = Dev8To1
SerialPort1.Close()
And this is the code for Arduino:
#include <Wire.h>
// PINS
// Current Sensors
const unsigned int PanelCS = 0;
const unsigned int ToEnelCS = 1;
const unsigned int RequiredCS = 2;
const unsigned int FromEnelToDevCS = 3;
const unsigned int FromEnelToBatteryCS = 4;
// Voltage dividers
const unsigned int PanelVD = 5;
const unsigned int BatteryVD = 6;
// Smart devices
const unsigned int Dev1 = 22;
const unsigned int Dev2 = 23;
const unsigned int Dev3 = 24;
const unsigned int Dev4 = 25;
const unsigned int Dev5 = 26;
const unsigned int Dev6 = 27;
const unsigned int Dev7 = 28;
const unsigned int Dev8 = 29;
const unsigned int Dev9 = 30;
const unsigned int Dev10 = 31;
const unsigned int Dev11 = 32;
const unsigned int Dev12 = 33;
const unsigned int Dev13 = 34;
const unsigned int Dev14 = 35;
const unsigned int Dev15 = 36;
const unsigned int Dev16 = 37;
// Variables
// Currents
int PanelCurrent;
int ToEnelCurrent;
int RequiredCurrent;
int FromEnelToDevCurrent;
int FromEnelToBatteryCurrent;
// Voltages
int PanelVoltage;
int BatteryVoltage;
// Powers
byte ProducedPower;
byte ConsumedPower;
int BoughtPower;
int SoldPower;
// Panel angle
byte PanelAngle;
// Communication Start Byte
byte CodeA;
// Bytes from PC
byte BytesFromPc[2];
void setup(){
pinMode(Dev1,OUTPUT);
pinMode(Dev2,OUTPUT);
pinMode(Dev3,OUTPUT);
pinMode(Dev4,OUTPUT);
pinMode(Dev5,OUTPUT);
pinMode(Dev6,OUTPUT);
pinMode(Dev7,OUTPUT);
pinMode(Dev8,OUTPUT);
pinMode(Dev9,OUTPUT);
pinMode(Dev10,OUTPUT);
pinMode(Dev11,OUTPUT);
pinMode(Dev12,OUTPUT);
pinMode(Dev13,OUTPUT);
pinMode(Dev14,OUTPUT);
pinMode(Dev15,OUTPUT);
pinMode(Dev16,OUTPUT);
Serial.begin(9600);
Wire.begin();
}
void loop(){
ProducedPower = 1;
ConsumedPower = 2;
BatteryVoltage = 3;
//-------------------------------------------------------------
Wire.requestFrom(2, 1);
while(Wire.available()){
PanelAngle = Wire.read();
}
if(Serial.available()) CodeA = Serial.read();
if(CodeA==0x41){
delay(50);
Serial.write(ProducedPower);
Serial.write(ConsumedPower);
Serial.write(BatteryVoltage);
Serial.write(PanelAngle);
if(Serial.available()){
for(int i=0; i<2; i++){
BytesFromPc[i] = Serial.read();
}
}
digitalWrite(Dev1, BytesFromPc[1] & 1);
digitalWrite(Dev2, (BytesFromPc[1] >> 1)& 1);
digitalWrite(Dev3, (BytesFromPc[1] >> 2)& 1);
digitalWrite(Dev4, (BytesFromPc[1] >> 3)& 1);
digitalWrite(Dev5, (BytesFromPc[1] >> 4)& 1);
digitalWrite(Dev6, (BytesFromPc[1] >> 5)& 1);
digitalWrite(Dev7, (BytesFromPc[1] >> 6)& 1);
digitalWrite(Dev8, (BytesFromPc[1] >> 7)& 1);
digitalWrite(Dev9, BytesFromPc[0] & 1);
digitalWrite(Dev10, (BytesFromPc[0] >> 1)& 1);
digitalWrite(Dev11, (BytesFromPc[0] >> 2)& 1);
digitalWrite(Dev12, (BytesFromPc[0] >> 3)& 1);
digitalWrite(Dev13, (BytesFromPc[0] >> 4)& 1);
digitalWrite(Dev14, (BytesFromPc[0] >> 5)& 1);
digitalWrite(Dev15, (BytesFromPc[0] >> 6)& 1);
digitalWrite(Dev16, (BytesFromPc[0] >> 7)& 1);
}
}
This evening I'll try to understand what Arduino exactly receives, but in the meantime I'd like to get some advice.
Thanks a lot!