2012-09-21 52 views
0

我無法在任何地方找到此信息。使用紅色電纜的TTL版本可以發送一個字符串多長時間?RedPark電纜readBytesAvailable每次讀取兩次

,當我從我的Arduino打印的東西徹底串行以下的委託方法被調用了兩次,一個字符串的例子是這樣的:144; 480,42; 532,40; 20E

- (void) readBytesAvailable:(UInt32)length{ 

當我使用檢索可用數據的新函數方法[getStringFromBytesAvailable]我只會得到144; 480,42; 532,40;然後再次調用整個函數,字符串現在包含字符串的其餘部分:20e

以下方法用於追加兩個字符串,但僅當數據傳輸速率爲「慢」(1次第二,我寧願每秒至少10次)。

-

(void) readBytesAvailable:(UInt32)length{ 

    if(string && [string rangeOfString:@"e"].location == NSNotFound){ 
     string = [string stringByAppendingString:[rscMgr getStringFromBytesAvailable]]; 
     NSLog(string); 
     finishedReading = YES; 
    } 
    else{ 
     string = [rscMgr getStringFromBytesAvailable]; 

    } 


    if (finishedReading == YES) 
    { 

     //do stuff 

    } 
     finishedReading = NO; 
     string = nil; 
    } 

} 

但是你能告訴我爲什麼,如果我寫了一個「長」的字符串,以及如何避免這一問題的方法被調用兩次?

回答

0

由於您的程序片段運行得更快,所以發送字符串所需的時間需要捕獲字節並將它們附加到字符串中。

如果串行數據以回車符結束,您可以測試它是否知道您何時收到整個字符串。

然後你可以讓你的Arduino每秒發送10次。

0

這就是串口如何工作。你不能也不需要避免這些問題。 SW/HW的任何級別都沒有嘗試保持串行數據流的完整性,因此在代碼中對此做任何假設都是錯誤的。串行數據只是一個字節流,沒有打包的概念。所以你必須處理這樣一個事實,即你可能需要讀取部分數據並在稍後閱讀其餘部分。

0

RedPark提供的redparkSerial頭文件中的serialPortConfig確實爲您提供了比您可能認識到的更多的配置控制。 readBytesAvailable:length方法是抽象的,僅當滿足以下兩個條件之一時纔會調用:主緩衝區中的數據超出rxForwardingTimeout值(默認設置爲100 ms)或達到rxForwardCount(默認設置爲16個字符)。

因此,就你的情況而言,在初始讀取後,你仍然可以獲得緩衝區中的數據,這意味着readBytesAvailable:length方法將再次被調用(從主運行循環中)以檢索剩餘的數據。我會建議玩rxForwardingTimeout和rxForwardCount,直到它按照您的預期執行。如前所述,雖然我建議在你的數據包的最後添加一個標誌(不必回車),以便識別。

而且,一些好的建議在這裏:How do you design a serial command protocol for an embedded system?

祝你好運!