2017-07-10 25 views
-1

Arduino Megaを使用してBLEモジュールのスループットを計算しています。モジュールは3.3Vで動作するので、ロジックレベルシフタはBLEとArduinoの間にあります。 BLE UARTは115200に設定され、64Kbpsの速度でデータを送信しています(CC2540 BLEパケットスニッファを使用して検証済み)。 BLEによって送信されるパケットは、16進数でこの形式になっています:400102030405060708090A0B0C0D0E0F1011121323 {40 = @、23 =#}。私は100個のパケットを送信しています。これは私のコードの要約です。コードは低ビットレート32Kbpsでは正常に動作しますが、64Kbsでは動作しません(BLE接続間隔は10ms)。このビットレートでは結果は表示されません。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; 
} 
} 

答えて

0

とき「パージ」シリアルバッファ:あなたは割り込みルーチンで設定されていたイベントがある場合

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. 
} 

は、あなたがデータを読む前にそれをリセットする必要があり、ない限りますフラグを割り込みデータのロックとして使用してください。

ここでは、スループットを大幅に向上させ、受信エラーを減らすために考慮すべき点について説明します。

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... 
     } 
    } 
    // ... 
} 
関連する問題