The code below works fine with the regular hardware Serial pins of the UNO ( actually an EtherTen PCB ) but not with the Software Serial on pins 10 & 11. Not sure why....
#include <SPI.h>
#include <SD.h>
#include <phi_interfaces.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#include "Wire.h"
#include <SoftwareSerial.h>
const int chipSelect = 4; // SD card select on shield
// Define the Machine Digital Inputs and Outputs
#define StartPB 8 // EtherTen mapping
#define total_buttons 1
char mapDIN[] = {'S'};
byte pinDIN[] = { StartPB};
phi_button_groups MyDIN(mapDIN, pinDIN, total_buttons);
char ValidDIN = '0';
const int numChars = 100;
char receivedChars[numChars] ;
char readCount[4];
unsigned int static recordCount = 0;
unsigned int noOfRecords = 0;
unsigned int ledState = LOW;
unsigned long scanMs = 10;
boolean newData = false;
boolean writeToSD = false;
boolean rdAllData = false;
boolean allRecIn = 0;
boolean waitForData = 0;
const byte recvLED = 13;
// DEFINE LCD PINS AND INSTANTIATE
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7); // 0x27 is the I2C bus address
SoftwareSerial mySerial(10, 11); // Tx of HM10 = 10 ; Rx of HM10 = 11
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// SETUP
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
void setup()
{
//Serial.begin(9600);
mySerial.begin(9600);
pinMode ( recvLED, OUTPUT );
digitalWrite ( recvLED, LOW );
Wire.begin();
// START THE LCD INTERFACE
lcd.begin(20, 4);
lcd.setBacklightPin(3, POSITIVE);
lcd.setBacklight(HIGH);
lcd.clear();
if (!SD.begin(chipSelect))
{
lcd.print(F("Card failed....."));
return; // No card .. just return..
}
lcd.print(F("SD Card OK....."));
pinMode(chipSelect, OUTPUT);
newData = false;
}
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// MAIN LOOP
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
void loop()
{
ValidDIN = MyDIN.getKey();
if ( ValidDIN == 'S' )
{
ValidDIN = '0';
eraseOldFiles();
waitForData = 1;
lcd.setCursor(0, 0);
lcd.print(F("Waiting for Data..."));
allRecIn = 0;
}
if ( waitForData == 1 )
{
recvWithStartEndMarkers(); // Read data from Serial port and store to SD card..
writeNewData2SDC();
}
delay(scanMs);
}
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// FUNCTIONS
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// FUNCTION TO READ SERIAL PORT AND MOVE DATA TO CHAR ARRAY..
void recvWithStartEndMarkers() {
static boolean recvInProgress = false;
static byte ndx = 0;
char startMarker = '[';
char endMarker = ']';
char inChar;
if (mySerial.available() > 0)
{ // Data available in In buffer ?
while (mySerial.available() > 0 && writeToSD == false )
{ // As long as there is data...
digitalWrite ( recvLED, HIGH );
inChar = mySerial.read(); // Read the databyte from serial buffer
if (recvInProgress == true)
{
if (inChar != endMarker)
{ // Upon StartMarker Read char and add to Char array
receivedChars[ndx] = inChar; // till the EndMarker arrives
ndx++;
if (ndx >= numChars)
{
ndx = numChars - 1; // To maintian fixed length records.
}
}
else
{
recvInProgress = false; // reset variable for next read..
ndx = 0;
writeToSD = true;
}
}
else if ( inChar == startMarker) recvInProgress = true ; // Await the start marker..
}
}
digitalWrite ( recvLED, LOW );
}
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// FUNCTION TO WRITE RECEIVED CHAR ARRAY TO SD CARD AND TRACK NO OF RECORDS RECEIVED.
void writeNewData2SDC()
{
char dataForLCD[21];
if ( writeToSD == true)
{
File dataFile = SD.open("GRPLAN.CSV", FILE_WRITE); // Open the file on the SD card.
if (dataFile)
{
dataFile.println(receivedChars); // Write the received characters to the SD card..
dataFile.close();
}
else {
lcd.clear();
lcd.print(F("GRPLAN.CSV"));
lcd.setCursor(0, 1);
lcd.print(F(" SD File Error !! "));
lcd.setCursor(0, 2);
lcd.print(F(" Reset and Verify.."));
while (1); // Hold the message...and wait for reset.
}
if (recordCount == 0)
{ // Is this the first Record count row ?
File dataFile = SD.open("GRPLAN.CSV", FILE_READ); // If so, grab and save the record Count.
for (int i = 2; i < 5; i++)
{
dataFile.seek(i);
readCount[i - 2] = dataFile.read();
}
noOfRecords = (atoi(readCount)) ; // Save the noOfRecords for comparison.
dataFile.close();
lcd.setCursor(0, 0);
lcd.print(F("Serial link active !"));
sprintf ( dataForLCD, "%03u Records to get.", noOfRecords);
lcd.setCursor(0, 1);
lcd.print(dataForLCD);
}
if ( recordCount > 0)
{ // Update Record count on LCD.
lcd.setCursor(0, 3);
sprintf( dataForLCD, "Record %03u recieved!", recordCount);
lcd.print( dataForLCD);
}
recordCount++; // Increment counter
if (recordCount == noOfRecords + 1 )
{ // All records have been received..
allRecIn = 1;
}
mySerial.println("OK"); // Data received and saved. Acknowledge to sender ..
writeToSD = false;
if (allRecIn == 1)
{
File planFile = SD.open("GRPLAN.CSV", FILE_READ); // Arrange to copy the Plan to Actual file..
File actualFile = SD.open("ACTUAL.CSV", FILE_WRITE);
size_t n; // Copy... fast using large size buffer
uint8_t buf[94];
while ((n = planFile.read(buf, sizeof(buf))) > 0)
{
actualFile.write(buf, n);
}
planFile.close();
actualFile.close();
lcd.clear();
lcd.print( "ACTUAL.CSV Created !");
delay(2000);
waitForData = 0;
}
}
}
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//**********************************************************
// Code to remove old and create a new GRPLAN.CSV & ACTUAL.CSV file.
void eraseOldFiles()
{
if (SD.exists("GRPLAN.CSV"))
{
if (!SD.remove("GRPLAN.CSV"))
{
lcd.setCursor( 0, 1);
lcd.print(F( " Error Erasing #1 "));
while (1);
}
}
if (SD.exists("ACTUAL.CSV")) {
if (!SD.remove("ACTUAL.CSV")) {
lcd.setCursor( 0, 1);
lcd.print(F( " Error Erasing #2 "));
while (1);
}
}
lcd.clear();
lcd.print( "Old files cleared !!");
delay (2000);
}