我四处搜寻,但找不到解决此问题的方法。我正在使用我能想到的最简单的例子来测试它。这是处理代码:
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。我能做些什么来解决这个问题?
谢谢