2013-12-14 100 views
0

我正试图从我的电脑与我的arduino进行通信。我在循环中发送1,0,0,0,并且arduino将收到的数据发送回去。然而,而不是让1,0,0,0回来了,这是我得到:C#与arduino的串行通信

1000 
1000 
1000 
1000 
1000 
1000 
1000 
0011 
0000 
0010 
0100 
1001 
0000 
0011 
0000 

正如你所看到的,它工作在开始,但开始几条短信后变得怪异。 而不是发送3 0它发送5.为什么?

这里是我的代码:

C#应用程序:

class Program 
{ 
    SerialPort p; 

    static void Main(string[] args) 
    { 
     Program p = new Program(); 
     p.initialize(); 
    } 
    private void initialize() 
    { 
     p = new SerialPort("COM3", 115200); 
     p.Open(); 

     byte[] data = { 1, 0, 0, 0 }; 

     Thread t = new Thread(reading); 
     t.Start(); 

     while(true) 
     { 
      p.Write(data, 0, data.Count()); 
     } 
     Console.ReadLine(); 
    } 
    private void reading() 
    { 
     while (true) 
     { 
      Console.WriteLine(p.ReadLine()); 
     } 
    } 
} 

的Arduino:

void setup() 
{ 
    Serial.begin(115200); 
    delay(5000); 
    Serial.println("Program started...."); 
} 

void loop() 
{ 
    for (int i = 0;i<4;i++) 
    { 
     Serial.print(Serial.read()); 
    } 
    Serial.println(); 
    delay(500); 
} 
+0

读取和写入线程似乎不会以相同的频率触发并且不同步。 – Dave

+0

我不这么认为,读写线程是完全独立的。此外,在Arduino上的值也是错误的 – user2422196

+0

我想你只是超载你的外部硬件。您的串行端口允许发送速度为1000,甚至不使用任何握手。这对于arduino板来说可能只是很多。 – PMF

回答

2

我认为问题是由Arduino的循环您的500毫秒的延迟造成的。

PC正在尽可能快地发送字符。

但是,Arduino接收4个字符,然后延迟1/2秒(在延迟期间,PC可以发送62,000个字符)。

有一段时间Arduino串行接收例程将字符放入缓冲区。但是,在正确接收到一些缓冲区后,开始用接收到的新字符覆盖旧字符。

要验证这是问题,请删除行延迟(500);从你的Arduino代码中加入一个延迟到PC后面:p.Write(data,0,data.Count());

另外,Console.ReadLine();永远得到执行,因为如果是在你的while(true)无限循环之后?