Buongiorno a tutti.
Avrei necessità di leggere sulla porta seriale (serial1) di arduino mega alcuni dati provenienti da un dispositivo basato su Pic.
Con il codice seguente fornito dal costruttore riesco a leggere correttamente:
//--------------------------------
int ui8Buffer[8][2];
int ui16Idx = 0;
int ui8CheckSum = 0;
//--------------------------------
void setup() {
Serial1.begin(9600);
Serial.begin(9600);
}
void loop() {
unsigned long currentMillis = millis();
unsigned long previousMillis = 0;
////////////////////////// Temporizzazione d1 1 secondo /////////////////////////
if (currentMillis - previousMillis >= 1000) {
previousMillis = currentMillis;
Ph();
Rdox();
}
}
int CalcChannel(unsigned char ui8type, unsigned char ui8Msb, unsigned char ui8Lsb) {
int ui8Temp;
if (ui8type == 0) {
ui8Temp = ui8Msb * 256 + ui8Lsb;
}
if (ui8type == 1) {
ui8Temp = ui8Msb * 256 + ui8Lsb;
ui8Temp = ui8Temp - 2048;
}
return (ui8Temp);
}
int Ph() {
int PH;
lettura();
if (((unsigned char)ui8CheckSum) == ui8Buffer[7][0]) {
Serial.println("Lettura del primo canale:");
if (ui8Buffer[1][0] == 0) Serial.println("ph:");
if (ui8Buffer[1][0] == 1) Serial.println("rx:");
PH = (CalcChannel((unsigned char) ui8Buffer[1][0], (unsigned char) ui8Buffer[2][0], (unsigned char) ui8Buffer[3][0])); //calcola il valore
Serial.println(PH);
}
else {
Serial.println("checksum error:");
}
ui16Idx = 0;
return (PH);
}
int Rdox() {
int RDOX;
lettura();
if (((unsigned char)ui8CheckSum) == ui8Buffer[7][0]) {
Serial.println("Lettura del secondo canale:");
if (ui8Buffer[4][0] == 0) Serial.println("ph:");
if (ui8Buffer[4][0] == 1)Serial.println("rx:");
RDOX = (CalcChannel((unsigned char) ui8Buffer[4][0], (unsigned char) ui8Buffer[5][0], (unsigned char) ui8Buffer[6][0])); //calcola il valore
Serial.println(RDOX);
}
else {
Serial.println("checksum error:");
}
ui16Idx = 0;
return (RDOX);
}
void lettura() {
if (Serial1.available() > 0) {
if (Serial1.read() == 0x55) {
ui8Buffer[0][0] = 0x55;
ui8Buffer[0][1] = 0;
do {
if (Serial1.available() > 0) {
ui16Idx++;
ui8Buffer[ui16Idx][0] = Serial1.read();
ui8Buffer[ui16Idx][1] = ui16Idx;
}
} while (ui16Idx <= 8);
ui16Idx = 0;
ui8CheckSum = 0;
for (ui16Idx = 0; ui16Idx < 7; ui16Idx++) {
ui8CheckSum = ui8CheckSum + ui8Buffer[ui16Idx][0];
}
ui16Idx = 0;
}
}
}
Il problema è che quando arrivano i dati, questi vengono stampati in maniera ripetuta più volte sul monitor. In pratica ad ogni ciclo arrivano le letture in questo modo:
Lettura del primo canale:
ph:
430
Lettura del secondo canale:
rx:
343
Lettura del primo canale:
ph:
430
Lettura del secondo canale:
rx:
343
Lettura del primo canale:
ph:
430
Lettura del secondo canale:
rx:
343
Lettura del primo canale:
ph:
430
Lettura del secondo canale:
rx:
343
Lettura del primo canale:
ph:
430
Lettura del secondo canale:
rx:
343
Vorrei che ad ogni ciclo venga stampata solo una coppia di valori cioè:
Lettura del primo canale:
ph:
430
Lettura del secondo canale:
rx:
343
In questo modo la seriale non si saturerebbe e mi consentirebbe altre operazioni, cosa che adesso no avviene perchè "impegnata" a ricevere sempre gli stessi dati.
Chiedo a voi un consiglio su come fare per risolvere questo problema, non avendo esperienza sulla comunicazione seriale.
Grazie saluti
Fabio