处理和C#串行读取Arduino中的垃圾/垃圾值

时间:2012-09-28 11:07:51

标签: c# serial-port arduino processing

我已经四处寻找,但无法找到解决此问题的方法。我正在使用我能想到的最简单的例子来测试它。这是处理代码:

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位移位在运行时似乎是随机的,而不是每次运行时都是一致的。我尝试在发送串行命令之间延迟最多200ms。它有点帮助,但我仍然得到至少10%的垃圾数据。我正在尝试运行一个控制回路,因此我能承受的最长延迟是3ms。 我该怎么做才能解决这个问题?

由于

1 个答案:

答案 0 :(得分:3)

  

如果我在串行监视器上查看输出,则会正确打印

     

偶尔会打印正确的值:

这指出配置错误,例如尝试4800波特。也许检查其他属性(stopbits,握手)。