Scenario
- Arduino 2560 with serial Port 6 Receiving data from my laptop on Serial Port 6 on laptop.
- Arduino is ;pushing results of receipt to Serial Monitor on Port 5.
- All ports are set up the same with speed of 9600 baud, and all the other stuff.
Laptop code which is C# which is close enough to C, C++ I think for most to understand.
string[] Data = PrepareDataToSend(Mode);
if (Data != null)
{
//Send this to prepare for the data for this mode.
string[] modes = { "MODE", Mode };
for (int i = 0; i < 2; i++)
{
serialPort1.Write(modes[i]+"\n");
}
//Send the data for the Mode sent above.
for (int i = 0; i < Data.Length; i++)
{
serialPort1.Write(Data[i]+"\n");
// Application.DoEvents();
// Thread.Sleep(150); ;
}
}
-
There a 5 Modes of operation, each mode has a certain number of Strings to process: usually in groups of 4 with the first one being a Name the last three are values. There is one group of just two, a Name and a Value.
-
Each mode has the name UDCLK with 3 values in it.
Testing reveals that the first Mode always passes and processes the Name , UDCLK, and 3 values, while the four Modes after that all fail on the very same Name of UDCLK.
I added the Sleep() into the equation, see commented out code, and now the first Mode fails and the four modes after it now all pass.
I noticed a larger hesitation right before the UDCLK, when the process got out of sync.
- There is one other thing I'm not sure about since it is in the Arduino code. That is the following code.
void loop()
{
// Convert my names to "int" values because of the switch statement not accept strings
String Names = "MODECRegDFWFTW1FTW2FSKRROSKIMOSKQMOSKRRPA1PA2QDACUDCLKRefCLK";
// 012345678901234567890123456789012345678901234567890123456789
using the same constant width char font the numbers line up with the start of the strings.
// if there's any serial available, read it:
while (Serial1.available() > 0)
{
Name = Serial1.readStringUntil('\n');
Serial.print("Name = ");Serial.println(Name);
pos = Names.indexOf(Name, 0);=====================Question about at end.
Serial.print("pos = ");Serial.println(pos);
// switch ( pos )
// {
// // look for the next valid String in the incoming serial buffer.
// case 0:
// Mode = Serial1.readStringUntil('\n');
// Serial.print(" Mode = "); Serial.println(Mode);
// break;
// case 4:
// CRAddress = Serial1.readStringUntil('\n');
// CRData = Serial1.readStringUntil('\n');
// CRLength = Serial1.readStringUntil('\n');
// Serial.print(" CRAddress = "); Serial.println(CRAddress);
// Serial.print(" CRData = "); Serial.println(CRData);
// Serial.print(" CRLength = "); Serial.println(CRLength);
// break;
// case 8:
// DFWAddress = Serial1.readStringUntil('\n');
// DFWData = Serial1.readStringUntil('\n');
// DFWLength = Serial1.readStringUntil('\n');
// Serial.print(" DFWAddress = "); Serial.println(DFWAddress);
// Serial.print(" DFWData = "); Serial.println(DFWData);
// Serial.print(" DFWLength = "); Serial.println(DFWLength);
// break;
// case 11:
// FTW1Address = Serial1.readStringUntil('\n');
// FTW1Data = Serial1.readStringUntil('\n');
// FTW1Length = Serial1.readStringUntil('\n');
// Serial.print(" FTW1Address = "); Serial.println(FTW1Address);
// Serial.print(" FTW1Data = "); Serial.println(FTW1Data);
// Serial.print(" FTW1Length = "); Serial.println(FTW1Length);
// break;
//
// case 15:
// FTW2Address = Serial1.readStringUntil('\n');
// FTW2Data = Serial1.readStringUntil('\n');
// FTW2Length = Serial1.readStringUntil('\n');
// Serial.print(" FTW2Address = "); Serial.println(FTW2Address);
// Serial.print(" FTW2Data = "); Serial.println(FTW2Data);
// Serial.print(" FTW2Length = "); Serial.println(FTW2Length);
// break;
// case 19:
// FSKRRAddress = Serial1.readStringUntil('\n');
// FSKRRData = Serial1.readStringUntil('\n');
// FSKRRLength = Serial1.readStringUntil('\n');
// Serial.print(" FSKRRAddress = "); Serial.println(FSKRRAddress);
// Serial.print(" FSKRRData = "); Serial.println(FSKRRData);
// Serial.print(" FSKRRLength = "); Serial.println(FSKRRLength);
// break;
// case 24:
// OSKIMAddress = Serial1.readStringUntil('\n');
// OSKIMData = Serial1.readStringUntil('\n');
// OSKIMLength = Serial1.readStringUntil('\n');
// Serial.print(" OSKIMAddress = "); Serial.println(OSKIMAddress);
// Serial.print(" OSKIMData = "); Serial.println(OSKIMData);
// Serial.print(" OSKIMLength = "); Serial.println(OSKIMLength);
// break;
// case 29:
// OSKQMAddress = Serial1.readStringUntil('\n');
// OSKQMData = Serial1.readStringUntil('\n');
// OSKQMLength = Serial1.readStringUntil('\n');
// Serial.print(" OSKQMAddress = "); Serial.println(OSKQMAddress);
// Serial.print(" OSKQMData = "); Serial.println(OSKQMData);
// Serial.print(" OSKQMLength = "); Serial.println(OSKQMLength);
// break;
// case 34:
// OSKRRAddress = Serial1.readStringUntil('\n');
// OSKRRData = Serial1.readStringUntil('\n');
// OSKRRLength = Serial1.readStringUntil('\n');
// Serial.print(" OSKRRAddress = "); Serial.println(OSKRRAddress);
// Serial.print(" OSKRRData = "); Serial.println(OSKRRData);
// Serial.print(" OSKRRLength = "); Serial.println(OSKRRLength);
// break;
// case 39:
// PA1Address = Serial1.readStringUntil('\n');
// PA1Data = Serial1.readStringUntil('\n');
// PA1Length = Serial1.readStringUntil('\n');
// Serial.print(" PA1Adress = "); Serial.println(PA1Address);
// Serial.print(" PA1Data = "); Serial.println(PA1Data);
// Serial.print(" PA1Length = "); Serial.println(PA1Length);
// break;
// case 42:
// PA2Address = Serial1.readStringUntil('\n');
// PA2Data = Serial1.readStringUntil('\n');
// PA2Length = Serial1.readStringUntil('\n');
// Serial.print(" PA2Address = "); Serial.println(PA2Address);
// Serial.print(" PA2Data = "); Serial.println(PA2Data);
// Serial.print(" PA2Length = "); Serial.println(PA2Length);
// break;
// case 45:
// QDACAddress = Serial1.readStringUntil('\n');
// QDACData = Serial1.readStringUntil('\n');
// QDACLength = Serial1.readStringUntil('\n');
// Serial.print(" QDACAddress = "); Serial.println(QDACAddress);
// Serial.print(" QDACData = "); Serial.println(QDACData);
// Serial.print(" QDACLength = "); Serial.println(QDACLength);
// break;
// case 49:
// UDClkAddress = Serial1.readStringUntil('\n');
// UDClkData = Serial1.readStringUntil('\n');
// UDClkLength = Serial1.readStringUntil('\n');
// Serial.print(" UDClkAddress = "); Serial.println(UDClkAddress);
// Serial.print(" UDClkData = "); Serial.println(UDClkData);
// Serial.print(" UDClkLength = "); Serial.println(UDClkLength);
// break;
// case 54:
// RefClockMultiplier = Serial1.readStringUntil('\n');
// delay(100);
// Serial.print(" RefClockMultiplier = "); Serial.println(RefClockMultiplier);
// break;
)
)
comment code should display in constant width chars.
quest: 1 -- As you can see I'm parsing the string to find a value to use as the "pos" in the case statement. My question is how reliable is the "string.indexOf " with respect to finding a substring stating point starting the search always at pos = 0 ??
quest: 2 -- and more important I'm begging to think, do I need to stop the serial flow with some sort of ack response while I process the data. For instance at 57600 baud all I get printed on the monitor is "\////\\44%%^^&&*&^&\ etc".
If you know of a good link which handles handshake protocol and how to set it up I would appreciate it.
Thanks in advance for your efforts.
pamam