You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

83 lines
1.9 KiB
Arduino

/* ArFO Development Version
*
* This software doesn't control the radio yet. It is just to test working with the
* iCom CI-V data stream coming from the radio.
*
* de NQ4T - 08-FEB-2020
*/
const byte numBytes = 32;
byte receivedBytes[numBytes];
byte numReceived = 0;
long vfoa;
boolean newData = false;
void setup() {
Serial.begin(9600);
Serial2.begin(9600);
Serial.println("CI-V Monitor Ready");
Serial.println();
}
void loop() {
recvBytesWithStartEndMarkers();
showNewData();
newData = false;
}
void recvBytesWithStartEndMarkers() {
static boolean recvInProgress = false;
static byte ndx = 0;
byte startMarker = 0xFE;
byte endMarker = 0xFD;
byte rb;
while (Serial2.available() > 0 && newData == false) {
rb = Serial2.read();
if (recvInProgress == true) {
if (rb != endMarker) {
receivedBytes[ndx] = rb;
ndx++;
if (ndx >= numBytes) {
ndx = numBytes - 1;
}
}
else {
receivedBytes[ndx] = '\0'; // terminate the string
recvInProgress = false;
numReceived = ndx; // save the number for use when printing
ndx = 0;
newData = true;
}
}
else if (rb == startMarker) {
recvInProgress = true;
}
}
}
void processciv() {
int i = 0;
long bcd[4];
for (int x = numReceived; x > 2; x--) {
bcd[i] = (((receivedBytes[x] >> 4) *10) + (receivedBytes[x]&0xF));
i++;
}
vfoa = ((bcd[0]*1000000)+(bcd[1]*10000)+(bcd[2]*100)+(bcd[3]));
}
void showNewData() {
if (newData == true) {
numReceived--;
processciv();
Serial.println();
Serial.print("VFO A: ");
Serial.print(vfoa, DEC);
Serial.print("kHz");
}
newData = false;
}