2

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

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。我能做些什么来解决这个问题?

谢谢

4

1 回答 1

3

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

有时它会打印正确的值:

这表明配置错误,例如尝试 4800 波特。也许检查其他属性(停止位,握手)。

于 2012-09-28T11:11:59.217 回答