Salut,
da der Code nicht sonderlich lange ist, hier das vollständige Listing:
#include <MsTimer2.h>
int bufferCount; // Anzahl der eingelesenen Zeichen
char buffer[80]; // Serial Input-Buffer
char temp[80];
char lastpin=2;
int blinkdelay;
boolean dbOpen = false;
static boolean readPort = false;
void setup()
{
Serial.begin(115200);
for (int i=2;i<14;i++) {pinMode(i,OUTPUT);}
MsTimer2::set(500, flash); // 500ms period
MsTimer2::start();
}
void loop()
{
/*
if (readPort) {
digitalWrite(led_pin, !digitalRead(led_pin));
if (dbOpen) {
Serial.print("SLBV001.");
Serial.print(analogRead(A0));
Serial.println("E");
}
}
*/
}
void serialEvent(){
char ch = Serial.read();
buffer[bufferCount] = ch;
bufferCount++;
if(ch == 13){
evalSerialData();
}
}
void evalSerialData()
{
int ptr;
int val;
strcpy(temp,"");
if ((buffer[0]=='S')&&(buffer[bufferCount-2]=='E')) {
strncat(temp, buffer, bufferCount-1);
if (strcmp(temp,"SQVERSIONE")==0){
strcpy(temp,"AC 1.0.0");
}
if (strcmp(temp,"SINITE")==0){
// setup the Dashboard
Serial.println("STTL1Dashboard DemoE");
Serial.println("SBTN001.0020.0040.0080.0025.Click MeE");
Serial.println("SCKB001.0105.0040.Led 5E");
Serial.println("SSLD001.0020.0070.0002.0013.0001.Led SwiperE");
Serial.println("SSLD011.0020.0150.0000.0250.0025.Led FaderE");
Serial.println("SCBO001.0020.0240.0080.0025E");
Serial.println("SCBA001.Port A0E");
Serial.println("SCBA001.Port A1E");
Serial.println("SCBA001.Port A2E");
Serial.println("SCBA001.Port A3E");
Serial.println("SCBA001.Port A4E");
Serial.println("SCBA001.Port A5E");
Serial.println("SCBS001.0002E");
Serial.println("SLBL001.0250.0040.0080.0030.0.00E");
Serial.println("SCKB011.0335.0040.Show Port DataE");
dbOpen = true;
}
if (strcmp(temp,"SGoodByeE")==0){
// stop the Dashboard
dbOpen = false;
}
if ((buffer[1]=='C')&&(buffer[2]=='K')&&(buffer[3]=='B')){
ptr = (buffer[4]-48)*10 + (buffer[5]-48);
if (ptr==0) {digitalWrite(5,((buffer[6]-48)==1));}
if (ptr==1) {readPort = (buffer[6]-48)==1;}
}
if ((buffer[1]=='B')&&(buffer[2]=='T')&&(buffer[3]=='N')){
ptr = (buffer[4]-48)*10 + (buffer[5]-48);
for (int i=2;i<14;i++) {digitalWrite(i,!(digitalRead(i)));}
}
if ((buffer[1]=='S')&&(buffer[2]=='L')&&(buffer[3]=='V')){
ptr = (buffer[4]-48)*10 + (buffer[5]-48);
val = (buffer[6]-48)*1000 + (buffer[7]-48)*100 + (buffer[8]-48)*10 + (buffer[9]-48);
if (ptr==0) {
digitalWrite(lastpin,LOW);
lastpin=val;
digitalWrite(lastpin,HIGH);
}
if (ptr==1) {
analogWrite(10,val);
}
}
} else {
strcpy(temp,"BadCmd: ");
strncat(temp, buffer, bufferCount);
Serial.println(temp);
}
bufferCount=0;
}
void flash()
{
int led_pin = 13;
if (readPort) {
digitalWrite(led_pin, !digitalRead(led_pin));
if (dbOpen) {
Serial.print("SLBV001.");
Serial.print(analogRead(A0));
Serial.println("E");
}
}
}
Ich dachte auch, dass der SerialEvent den Prozessor blockt, aber dann müsste er das auch für die getimte Routine machen. Ausserdem schcike ich in der Zeit nichts sondern lese eldiglich auf der PC Seite die geschickten Werte und stelle sie in einem Graph dar.
Das Ganze dient übrigens als Plotroutine, so dass ich im Dashboard mit nur einem Kommando ein Graph-Control anfordern kann und dann Daten vom Arduino geplottet werden. Das habe ich immer vermisst, wenn ich z.B. den Input an A0-A5 betrachten will
Inzwischen ist das Dashboard mit den Controls Button, CheckBox, Combobox, Label und Slider fertig
Ciao, Mathias