本帖最後由 pizg 於 2013-4-20 01:10 編輯
首先, 感謝cooper和babyfish0226兩位老師的釋疑.
我個人的看法如下:
1.原始範例程式碼有點問題, 誠如cooper老師所說的它會等不到換行字元'\n', 所以不會印出任何東西.
我的作法跟cooper老師有點不同, 我是去修改程式碼, 去除'\n'的判斷式, 只留下
stringComplete = true;
這一行, 此部分做法跟babyfish0226老師的做法一樣.
2.serialEvent();這部分我跟babyfish0226老師的做法不一樣.
在參考文獻中指出 serialEvent() 這個函數會在每一次執行loop()時先被執行,
所以serialEvent()函數無須加在loop()裏面.
我的結論是:
這個範例的確是serialEvent()在讀取資料時, 還來不及讀完就被loop()所影響(註A),
因此, 只需要在loop()的最後一行加入適當的delay()即可,
如果Serial要讀的資料量很大, 那麼delay的時間就要相對地增多.程式碼如下:
- //延遲0.1秒時間,讓SerialEvent有足夠的時間去讀取COM PORT資料。
- String inputString = ""; // a string to hold incoming data
- boolean stringComplete = false; // whether the string is complete
- void setup() {
- // initialize serial:
- Serial.begin(9600);
-
- // reserve 200 bytes for the inputString:
- //inputString.reserve(250);
- }
- void loop() {
- // print the string when a newline arrives:
- if (stringComplete) {
- Serial.println(inputString);
- }
- // clear the string:
- inputString = "";
- stringComplete = false;
- delay(100);
- }
- /*
- SerialEvent occurs whenever a new data comes in the
- hardware serial RX. This routine is run between each
- time loop() runs, so using delay inside loop can delay
- response. Multiple bytes of data may be available.
- */
- void serialEvent() {
- while (Serial.available()) {
- // get the new byte:
- char inChar = (char)Serial.read();
- // add it to the inputString:
- inputString += inChar;
- // if the incoming character is a newline, set a flag
- // so the main loop can do something about it:
- stringComplete = true;
- }
- }
複製代碼
以上純屬個人意見, 如有錯誤還請各位先進不吝指正.
註A: loop()不會理會SerialEvent()是否已執行完畢。 |