Serielle Daten verarbeiten von Icom CI-V

Hallo liebe Gemeinde.
Erst einmal wünsche ich ein Frohes neues Jahr.

Ich habe ein Funkgerät dessen Daten ich per CI-V Schnittstelle (am Arduino Serial2) empfange und sende.
Das senden klappt super :slight_smile: :slight_smile:
das Empfangen teilweise auch.
Jetzt würde ich gerne die Frequenz auslesen und mir auf das Nextion schicken.
Bis zum empfang Funktioniert alles.

18:56:02.595 ->(Abfrage der Frequenz) FE FE 7A E0 03 FD;
18:56:02.595 ->(Emfpang Frequenz) FE FE E0 7A 03 00 69 30 FD;

hier besteht die Frequenz aus 3.6900 MHz
also ab FD für das endbyte rückwärtsgelesen.
Das ganze habe ich in meinem Sketch auch berücksichtigt.

Wenn ich jetzt freq(x) einzelnd an das Nextion schicke, wird es mir auch richtig angezeig,

sobald ich versuche diese daten zusammen zu führen entsteht mist bzw ich bekomme irgendwas angezeigt.

kennt da jemand eine lösung für ??

#define trx_adress 0x7A

byte NexT[3] = {255, 255, 255};

      // Kommunikation
int Nex; // Nextion Data
int incomingByte; // RS485 Data
int trxByte;      // TRX Data

      //  Millis
unsigned long trxdelay = 0;
#define trx_delay 400

int readCounter = 0;
int QRG;
int freq1;
int freq2;
int freq3;
int freq4;

void setup() {
  Serial.begin(9600);
  Serial1.begin(9600);
  Serial2.begin(9600);
}

void loop() {
  if (Serial.available() > 0) {
    incomingByte = Serial.read();
    Serial.print(incomingByte);
  }
  if (Serial1.available() > 0) {
    Nex = Serial1.read();
    Serial.print(Nex, HEX);
  }
  if (Serial2.available() > 0) {
    trxByte = Serial2.read();
    readCounter++;
    Serial.print(trxByte, HEX);
  }
  if (millis() - trxdelay >= trx_delay) {
    trxdelay = millis();
    
      Serial2.flush();
      Serial2.write(0xFE);
      Serial2.write(0xFE);
      Serial2.write(trx_adress);
      Serial2.write(0xE0);
      Serial2.write(0x03);
      Serial2.write(0xFD); // end sequence

      readCounter = 0;
    }
  
    if (readCounter == 12) {
      freq4 = (trxByte);
    }
    if (readCounter == 13) {
      freq3 = (trxByte);
    }
    if (readCounter == 14) {
      freq2 = (trxByte);
    }
    if (readCounter == 15) {
      freq1 = (trxByte);
  }
  QRG = 0;
  QRG = (freq1);

//QRG 0 (freq1)+(freq2)+(freq3)+(freq4);

  Serial1.print("t40.txt=");
  Serial1.write(0x22);
  Serial1.print(QRG);
  Serial1.write(0x22);
  Serial1.write(NexT, 3);
}

Hello OM
verpasse deinem Sketch ein paar Kommentare und/oder beschreibende Variablenamen.
73

weil wir das gerade zwei Threads weiter unten durch gemacht haben:

Bitte schau dir das Tutorial Serial Input Basic an wie man Zeichen einliest:

https://forum.arduino.cc/index.php?topic=396450

Dann schaust dass du ein sauber befülltes:

char receivedChars[numChars];

hast. Deine Endzeichen sind offenbar FD

dann bin ich mir nicht sicher bei deinem Beispiel:

FE FE E0 7A 03 00 69 30 FD;
hier besteht die Frequenz aus 3.6900 MHz

sicher?
nicht 3.9600?
oder 30.6900?

warum wäre byte 7 gedreht aber byte 6 nicht?
zumindest steht das so in der Protokoll-Specifikation, dass das BCD encoded ist.

Ach und bevor man was neues erfindet, ist das nicht etwas was man reusen könnte?

oder

beim Github Link gibts auch das Protokoll für uns SWL'er die mit Amateurfunk sonst nichts am Hut haben (theoretisch).

edit: dieser Sketch ist zwischenzeitlich bei mir entstanden (basierend auf anderer Leute vorarbeit:
https://werner.rothschopf.net/microcontroller/202102_arduino_antennaswitch_en.htm

Ich weiß auf wen du anspielst :smiley:

Wenn du deine Frequenz wirklich 36900 MHz sind musst du QRG als

unsigned int QRG;

definieren. Integer geht nur bis 32767.
Und mit:

//QRG 0 (freq1)+(freq2)+(freq3)+(freq4)

Addierst du die Frequenzen nur auf, das würde dann in deinem Fall 102 ergeben.

QRG = (freq1*1000)+(freq2*100)+(freq3*10)+(freq4);

müsste funktionieren(Vielleicht gibts noch schönere Methoden).
Gruß
Skyliiine