我已经四处寻找,但无法找到解决此问题的方法。我正在使用我能想到的最简单的例子来测试它。这是处理代码:
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。 我该怎么做才能解决这个问题?
由于
答案 0 :(得分:3)
如果我在串行监视器上查看输出,则会正确打印
偶尔会打印正确的值:
这指出配置错误,例如尝试4800波特。也许检查其他属性(stopbits,握手)。