Buongiorno a tutti.
Aggiorno il post sperando in un aiuto per un problema inspiegabile.
Il codice seguente dato dal fornitore del dispositivo basato su pic che "dovrebbe" inviare i dati al mio arduino mega (anzi lo ha sempre fatto ma ora non più), mi permette di leggere sulle porte seriali e stampare i valori riscontrati di ph e redox.
Naturalmente il codice è sia per l'uso con softserial che Serial1.
Di seguito uno screenshot di ciò che leggo a parità di dati inviati dal dispositivo sulla porta seriale simulata e su una delle seriali hardware di arduino mega.
Premetto che ho provato a testare le seriali hw di mega e funzionano perfettamente.
Come si può evincere dall'immagine, entrambe le seriali leggono perfettamente il dato iniziale 0x55 (cioè 85), ma successivamente nell'indice da 1 a 8 i valori sono decisamente errati.
Come è possibile che la seriale simulata legge correttamente i dati che arrivano mentre la seriale hardware legge dai errati?
Spero vivamente in un aiuto per dare una spiegazione logica al problema.
Grazie a tutti in anticipo.
#include <SoftwareSerial.h>
#define rxPin 10
#define txPin 11
SoftwareSerial softSerial = SoftwareSerial(rxPin, txPin);
//--------------------------------
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 ui8Buffer[8][2];
int ui16Idx=0;
int ui8CheckSum=0;
//--------------------------------
//
void setup() {
pinMode(rxPin, INPUT);
pinMode(txPin, OUTPUT);
softSerial.begin(9600);
//Serial1.begin(9600);
Serial.begin(9600);
Serial.println ("test lettura seriale hw");
}
void loop() {
// send data only when you receive data:
if (softSerial.available() > 0) //per arduino1
//if (Serial1.available() > 0) //per arduino mega
{
if (softSerial.read()==0x55) { // per arduino1
// if (Serial1.read()==0x55) { //per arduino mega
Serial.println(0x55);
ui8Buffer[0][0]=0x55;
ui8Buffer[0][1]=0;
do {
if (softSerial.available() > 0) { // per arduino1
//if (Serial1.available() > 0) { //per arduino mega
Serial.println (ui16Idx);
ui16Idx++;
ui8Buffer[ui16Idx][0] = softSerial.read();//per arduino1
//ui8Buffer[ui16Idx][0] = Serial1.read();//per arduino mega
ui8Buffer[ui16Idx][1] = ui16Idx;
Serial.println (ui8Buffer[ui16Idx][0]);
}
}while (ui16Idx<=8);
ui16Idx=0;
ui8CheckSum=0;
//Calcolo del check sum
for (ui16Idx=0;ui16Idx<7;ui16Idx++){
ui8CheckSum = ui8CheckSum + ui8Buffer[ui16Idx][0];
}
Serial.println ("mio checksum");
Serial.println (ui8CheckSum);
ui16Idx=0;
if (((unsigned char)ui8CheckSum)==ui8Buffer[7][0]){
Serial.println("checksum calcolato:");
Serial.println((unsigned char)ui8CheckSum);
Serial.println("Pacchetto ricevuto:");
Serial.println("Lettura del primo canale:");
if (ui8Buffer[1][0]==0) Serial.println("ph:");
if (ui8Buffer[1][0]==1) Serial.println("rx:");
Serial.println(CalcChannel((unsigned char) ui8Buffer[1][0], (unsigned char) ui8Buffer[2][0], (unsigned char) ui8Buffer[3][0])); //calcola il valore
//
Serial.println("Lettura del secondo canale:");
if (ui8Buffer[4][0]==0) Serial.println("ph:");
if (ui8Buffer[4][0]==1)Serial.println("rx:");
Serial.println(CalcChannel((unsigned char) ui8Buffer[4][0], (unsigned char) ui8Buffer[5][0], (unsigned char) ui8Buffer[6][0])); //calcola il valore
//
}
else {
Serial.println("checksum error:");
}
ui16Idx=0;
}
}
}