2017-07-10 2 views
-1

Ich berechne Durchsatz von BLE-Modul mit Arduino Mega. Das Modul arbeitet mit 3.3V und ich habe Logic Level Shifter zwischen BLE und Arduino. BLE UART ist auf 115200 gesetzt und sendet Daten mit einer Geschwindigkeit von 64 Kbps (verifiziert mit CC2540 BLE Packet Sniffer). Pakete, die von BLE gesendet werden, haben das folgende Format: 400102030405060708090A0B0C0D0E0F1011121323 {40 = @, 23 = #}. Ich sende 100 Anzahl von Paketen. Hier ist die Zusammenfassung meines Codes. Code funktioniert gut für niedrigere Bitrate 32 Kbps, aber nicht für 64 Kb (BLE Verbindungsintervall zu 10ms). In dieser Bitrate wird kein Ergebnis angezeigt.Hohe Bitrate in Arduino Mega

void loop() 
{ 
if(rxflag) 
{ 
rxflag = false; 
switch(rxState) 
{ 

case get_first_header: 
if(rxChar=='@') 
{ 
startPoint=millis(); 
rxState=get_last_header; 
} 
break; 

case get_last_header: 
if(rxChar=='#') 
{ 
packetNo++; 
if(packetNo==100) 
{ 
endPoint=millis(); 
totalTime= endPoint-startPoint; 
Serial.print("Total Time of Packet="); 
Serial.println(totalTime); 
} 
break; 
} 
} 
} 

void serialEvent1() 
{ 
if (Serial1.available()>0) 
{ 
rxChar = (char)Serial1.read(); 
rxflag = true; 
} 
} 

Antwort

0

Wenn Sie ‚Säuberung‘ der seriellen Puffer:

void serialEvent1() 
{ 
    if (Serial1.available()>0) 
    { 
    rxChar = (char)Serial1.read(); // was previous value of rxChar read ? mystery... 
             // this is a serious problem. 

             // 1 byte at a time? This can slow down 
    rxflag = true;     // reception quite a bit, esp. if there 
    }         // is xon/xoff. 
} 

Wenn Sie ein Ereignis haben, die in einer Interrupt-Routine gesetzt worden ist, müssen Sie es zurücksetzen, bevor die Daten zu lesen, es sei denn Sie Verwenden Sie das Flag als Sperre für Interruptdaten.

Folgendes sollten Sie beachten, um den Durchsatz drastisch zu verbessern und Empfangsfehler zu reduzieren.

void serialEvent1() 
{ 
    rxflag = true; 
} 

//... 
void lopp() 
{ 
    // ... 
    if (rxflag) 
    { 
     rxflag = false;     // reset/read order is to avoid stalling. 
     while (Serial1.available()) 
     { 
      // reading 4 or up 16 bytes at a time on a local buffer 
      // would help the tiny mega get this done job done faster. 
      // 
      // char buffer[8] buffer; // 2 dwords on the stack. don't overuse! 
      // 
      char c = (char)Serial.read(); 
      // run state machine... 
     } 
    } 
    // ... 
}