我已經四處搜索,但無法找到解決此問題的解決方案。我使用我能想到的最簡單的例子來測試這個。這是處理代碼:來自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。 我能做些什麼來解決這個問題?
感謝
經過一段時間後,我發現設置serialPort.DtrEnable = true;修復它爲C#。儘管如此,我仍然沒有解決方案。 – blooop