2012-09-28 104 views
2

我已經四處搜索,但無法找到解決此問題的解決方案。我使用我能想到的最簡單的例子來測試這個。這是處理代碼:來自Arduino的處理和C#串行讀取垃圾/垃圾值

void setup() {  
    Serial.begin(9600); 
} 

void loop() { 
    for(int i =48;i<51;i++) { 
    Serial.write(i); //writes 0-2 in ascii and 48-51 in bytes. 
    } 
} 

如果我查看序列顯示器上輸出它正確打印「012012012012012012012」等沒有任何問題。我在處理寫了一個簡單的程序來查看數據:

import processing.serial.*; 
Serial myPort; 

void setup() { 
    String[] ports =Serial.list(); 
    myPort = new Serial(this, ports[1], 9600); 
} 

void draw() { 
    if (myPort.available() >=10) 
    { 
    byte[] serialIn = new byte[10]; 
    myPort.readBytes(serialIn); 
    for (int i =0;i<serialIn.length;i++) 
    { 
     println(serialIn[i] +" binary:"+ binary(serialIn[i])); 
    } 
    } 
} 

大部分打印垃圾時間:

-126 binary:10000010 
-118 binary:10001010 
-110 binary:10010010 
-126 binary:10000010 
-118 binary:10001010 
-110 binary:10010010 

,有時你必須打印正確的價值觀:

48 binary:00110000 
49 binary:00110001 
50 binary:00110010 
48 binary:00110000 
49 binary:00110001 
50 binary:00110010                 

它看起來每個字節都被移動到左邊3位,但我無法弄清楚爲什麼每次運行程序時它的行爲都不一樣。有趣的是,如果我得到arduino發送0,1,2它從不打印垃圾。

真的我想讀取C#中的數據。這是C#代碼的肉這是基於這個例子: http://msmvps.com/blogs/coad/archive/2005/03/23/SerialPort-_2800_RS_2D00_232-Serial-COM-Port_2900_-in-C_2300_-.NET.aspx

if (serialPort.BytesToRead >0) 
{ 
    byte temp = (byte)serialPort.ReadByte(); 
    Console.WriteLine(temp +"\t binary: " +byte2Binary(temp)); 
} 

它打印出一些正確的價值觀,但往往忽視數量和散佈垃圾:

130 binary: 10000010 
138 binary: 10001010 
48  binary: 00110000 
49  binary: 00110001 
50  binary: 00110010 
146 binary: 10010010 
49  binary: 00110001 
50  binary: 00110010 
49  binary: 00110001 
50  binary: 00110010 
146 binary: 10010010 
49  binary: 00110001 
50  binary: 00110010 
48  binary: 00110000 
138 binary: 10001010 
146 binary: 10010010 

二進制不正確數據的值與處理二進制值完全相同。這裏的3位移位在運行時看起來是隨機的,而不是每次運行時都一致。我曾嘗試在發送串行命令之間延遲200毫秒。它有點幫助,但我仍然至少得到10%的垃圾數據。我試圖運行一個控制循環,所以我能承受的最長延遲是3ms。 我能做些什麼來解決這個問題?

感謝

回答

3

如果我查看序列顯示器上輸出它正確打印

,有時你必須打印正確的價值觀:

這表明在配置錯誤,嘗試4800波特例如。也許檢查其他屬性(stopbits,握手)。

+0

經過一段時間後,我發現設置serialPort.DtrEnable = true;修復它爲C#。儘管如此,我仍然沒有解決方案。 – blooop