Hallo
Ich habe zu einem funktionierenden Code den SoftwareSerial den ich für das GPS Modul benötige hinzugefügt aber es scheint dass dadurch irgendwie die Timer oder der Ram in mitleidenschaft gezogen wird... Und das nur durch das hinzufügen von
mySerial.begin(9600);
Jedenfalls funktioniert dann nix mehr, wobei das Timing eine grosse rolle spielt...
hier der Code - bitte nicht haun, ist ein wenig chaotisch..
#define wb_analog 0
#define log_enable 5 //Switch to ground to enable logging
#define LED 13
#define chipSelect 6
////////////////////// K Options /////////////////////////
#define Serial1_baud 10400
#define TX 1
const uint16_t t_01 = 6000; // delay bevore starting
const uint16_t t_02 = 25; // fast init delay
const uint16_t t_03 = 150; // timeout time
const uint16_t t_04 = 43; // read write delay
uint32_t time, tr_1, tr_2, tr_3;
uint8_t mode, outCntr, inCntr, inByte, chksm, lngt;
boolean started_;
byte K_START_COM[5] = {
0x81, 0x12, 0xF1, 0x81, 0x05
};
byte K_READ_ALL_SENS[7] = {
0x80, 0x12, 0xF1, 0x02, 0x21, 0x08, 0xAE
};
//byte K_BUFFER[0xFF];
String K_BUFFER, PRINT_BUFFER, GPS_BUFFER, NMEA;
/////////////////////////////////////////////////////////
#include <SdFat.h>
#include <SoftwareSerial.h>
SdFat sd;
SdFile myFile;
SoftwareSerial gps(8, 7);
////////////////// Global Variables ///////////////////////
boolean logging;
void setup() {
Serial.begin(115200); // Start Serial Comunication
// gps.begin(9600);
delay(400); // catch Due reset problem
pinMode(TX, OUTPUT); // Set TX to Output - Needed for K
pinMode(LED, OUTPUT); // Set LED to Output
/////////////// LOGING OPTIONS ///////////////////////
pinMode(log_enable, INPUT_PULLUP);
if (!sd.begin(chipSelect, SPI_FULL_SPEED)) {
Serial.println("No SD Card available!!");
logging = false;
}
else {
Serial.println("SD Card available!!");
logging = true;
}
/////////////// GPS OPTIONS ///////////////////////
// gps.write("$PMTK251,57600*2C\r\n");
// gps.end();
// gps.begin(57600); // Reconnect at new speed
// delay(1000); // Delay to let change take effect
// gps.write("$PMTK314,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*29\r\n"); // RMC
// gps.write("$PMTK220,100*2F\r\n"); // update 10HZ
// gps.write("$PGCMD,33,0*6D\r\n"); // DISABLE ANTENNA OUTPUT
}
void loop() {
if (Serial.available()) { // Reset K_ only for debugg
Serial.read();
started_ = false;
}
if (mode == 0) { // Start Sequence
if (k_transmit(K_START_COM, 5)) {
switchLed(); // toggle LED
Serial.println(K_BUFFER);
K_BUFFER = "";
mode++;
}
}
if (mode == 1) { // Run over Sentence Request
if (k_transmit(K_READ_ALL_SENS, 7)) {
switchLed(); // toggle LED
// Serial.println();
// for (int x = 0; x < K_BUFFER_Cntr; x++) {
// Serial.print(K_BUFFER[x]);
// Serial.print(",");
// }
// Serial.println();
time = millis();
PRINT_BUFFER += time;
PRINT_BUFFER += ",";
// Serial.println(K_BUFFER);
PRINT_BUFFER += K_BUFFER;
Serial.println(PRINT_BUFFER);
if (log_enable == LOW) { // write to sd
writetosd(PRINT_BUFFER);
}
PRINT_BUFFER = "";
K_BUFFER = "";
}
}
//////////////////////////////////// GPS Section //////////////////////////
// if (gps.available()) {
// char c = gps.read();
// GPS_BUFFER += c;
// if (c == 36) {
// NMEA += GPS_BUFFER;
// Serial.println(NMEA);
// NMEA = "";
// GPS_BUFFER = "";
// }
// }
}
boolean k_transmit(byte * function, byte num) {
if (!started_) {
if (Serial1.available()) { // Empty Buffer
Serial1.read();
}
Serial1.end();
time = millis(); // get Time
if (!tr_3) { // reset Timer
tr_3 = millis();
}
if (tr_3 + t_01 > time) { // Switch t_01 High
digitalWrite (TX, HIGH);
}
if ((tr_3 + t_01 < time) && (tr_3 + t_01 + t_02 > time)) { // Switch t_02 LOW
digitalWrite (TX, LOW);
}
if ((tr_3 + t_01 + t_02 < time) && (tr_3 + t_01 + t_02 + t_02 > time)) { // Switch t_02 High
digitalWrite (TX, HIGH);
}
if (tr_3 + t_01 + t_02 + t_02 < time) { // Start Serial Comunication
Serial1.begin(Serial1_baud);
mode = 0;
outCntr = 0;
inCntr = 0;
inByte = 0;
chksm = 0;
lngt = 0;
tr_1 = 0;
tr_3 = 0;
tr_2 = millis();
started_ = true;
}
}
else {
time = millis();
if ((num > outCntr) && (time >= tr_1 + t_04)) {
Serial1.write(function[outCntr]);
outCntr++;
}
if (Serial1.available()) {
inByte = Serial1.read();
inCntr++;
// Serial.print(inByte);
// Serial.print(",");
// if ((inCntr > outCntr + 4) && (inCntr < lngt + 5 + outCntr)) {
// K_BUFFER[K_BUFFER_Cntr] = inByte;
// K_BUFFER_Cntr++;
// }
K_BUFFER += inByte; // Write data to Buffer
K_BUFFER += ","; // Write data to Buffer
//////////// Calculate Checksum //////////////
if (inCntr == 4 + outCntr) {
lngt = inByte;
}
if ((inCntr > outCntr) && (inCntr < lngt + 5 + outCntr)) {
chksm = chksm + inByte;
}
if (inCntr == lngt + 5 + outCntr) {
if (chksm == inByte) {
// time = millis();
// Serial.print(time - tr_1);
outCntr = 0;
inCntr = 0;
inByte = 0;
chksm = 0;
lngt = 0;
tr_2 = millis();
tr_1 = millis();
return 1;
}
}
}
else {
time = millis();
if (time > tr_2 + t_03) {
Serial.println("TIMEOUT");
started_ = false;
}
}
}
return 0;
}
int read_wideband() {
uint16_t afr = map(analogRead(wb_analog), 0, 1023, 1000, 1998);
return afr;
}
void writetosd(String data) {
if (logging) {
if (!myFile.open("logfile.csv", O_RDWR | O_CREAT | O_AT_END)) {
Serial.println("No SD Card available!!");
logging = false;
}
myFile.println(data);
myFile.close();
}
}
void switchLed() {
digitalWrite (LED, !digitalRead(LED));
}