03-19-2018 08:49 PM
What is the device sending the data? I'd like to take a look at its manual (presumed available on the Web) to better understand its data structure.
Bob Schor
03-20-2018 01:32 PM
I have a gyroscope sending data to a ATmega2560 arduino, the Arduino sends the data to the PC.
Below is the Arduino code:
#include "TimerOne.h" enum Gyro_Status { WARNING, NO_DATA, CAUTION, NORMAL, CHECKSUM_FAIL }; struct PacketType { byte Status; byte TagID; byte angleLSB; byte angleMSB; byte TagData; byte CheckSum; byte index; boolean complete; boolean processed; }; PacketType GyroPacket = {0, 0, 0, 0, 0, 0, 0, false, true}; unsigned short combined; boolean Trigger=false; boolean LoopTrigger=false; unsigned long StartTime; unsigned long LoopTime; void setup() { pinMode(42, OUTPUT); pinMode(34, OUTPUT); pinMode(38, OUTPUT); pinMode(32, INPUT); // put your setup code here, to run once: Serial.begin(57600); Serial1.begin(1000000); digitalWrite(38,HIGH); digitalWrite(34,HIGH); Timer1.initialize(2000); Timer1.attachInterrupt(Blink); StartTime = millis()-1; } void loop() { while (Serial.available()){ byte val= Serial.read(); if (val == 'A'){ Serial.println("Hello!"); StartTime = millis(); LoopTrigger=true; } if (val == 'Z'){ Serial.println("Hi!"); LoopTrigger=false; } } if(Trigger && LoopTrigger){ //Serial.println("Hello world!"); digitalWrite(38,HIGH); LoopTime=millis()-StartTime; digitalWrite(42,HIGH); while(Serial1.available() && !GyroPacket.complete && GyroPacket.processed){ // Serial.println("Reading!"); byte Sum = 0; byte RECvalue = Serial1.read(); byte statusCheck; PacketWrite(GyroPacket, GyroPacket.index, RECvalue); GyroPacket.index++; // Serial.print("I received: "); // Serial.println(GyroPacket.index); // Serial.println(RECvalue); if(GyroPacket.index == 6){ GyroPacket.complete = true; GyroPacket.processed = false; GyroPacket.index = 0; statusCheck = (GyroPacket.Status & 0xC0) >> 6; Sum = GyroPacket.Status + GyroPacket.TagID + GyroPacket.angleLSB + GyroPacket.angleMSB + GyroPacket.TagData + GyroPacket.CheckSum; // Serial.print("Sum = "); // Serial.println(Sum); if (Sum != 0xFF){ // Serial.println("CHECKSUM_FAIL!"); // Serial.println("C_F"); }else{ //Serial.println("CHECKSUM_CORRECT!"); //Serial.println("C_C"); if (statusCheck != NORMAL){ switch (statusCheck) { case WARNING: Serial.println("WARNING"); break; case NO_DATA: Serial.println("NO_DATA"); break; case CAUTION: Serial.println("CAUTION"); break; default: //error Serial.println("Status Read Error"); } } else { // Serial.println("NORMAL"); if(digitalRead(32)== HIGH){ // Serial.println("OK"); combined = GyroPacket.angleMSB; //send MSB to rightmost 8 bits combined = combined<<8; //shift MSB over to leftmost 8 bits combined |= GyroPacket.angleLSB; //logical OR keeps MSB intact in combined and fills in rightmost 8 bits Serial.print("*"); Serial.print(LoopTime); Serial.print("$"); Serial.print(combined,DEC); Serial.print("#"); } else{ Serial.print("Gyro NOT OK!"); } } } } } digitalWrite(42,LOW); GyroPacket.complete = false; GyroPacket.processed = true; digitalWrite(38,LOW); Trigger=false; } } void Blink() { Trigger=true; } void PacketWrite(PacketType &dataPacket, byte index, byte value){ switch(index){ case 0: dataPacket.Status = value; break; case 1: dataPacket.TagID = value; break; case 2: dataPacket.angleLSB = value; break; case 3: dataPacket.angleMSB = value; break; case 4: dataPacket.TagData = value; break; case 5: dataPacket.CheckSum = value; break; default: dataPacket.index = 0; } }
The output data from LabVIEW looks like this:
*11$64600# *13$64600# *16$64600# *18$64598# *19$64597# *21$64598# *23$64600# *25$64599#