如何从PC接收数据到Arduino?

时间:2011-11-27 01:58:26

标签: c# serial-port arduino

我开发了一个通过串口发送Arduino数据的应用程序,但我无法理解如何在Arduino上接收它。我通过Arduino的串口发送一个字符串,Arduino接收它,但它在我的代码中不起作用(在Arduino上,我一次收到一个字节)。

更新:它正在运行;)

C#中发送数据的代码:

using System;
using System.Windows.Forms;

using System.Threading;
using System.IO;
using System.IO.Ports;

pulic class senddata() {

    private void Form1_Load(object sender, System.EventArgs e)
    {
        //Define a serial port.
        serialPort1.PortName = textBox2.Text;
        serialPort1.BaudRate = 9600;
        serialPort1.Open();
    }

    private void button1_Click(object sender, System.EventArgs e)
    {
        serialPort1.Write("10");  //This is a string. The 1 is a command. 0 is interpeter.
    }
}

Arduino代码:

我已更新代码

#include <Servo.h>

Servo servo;
String incomingString;
int pos;

void setup()
{
    servo.attach(9);
    Serial.begin(9600);
    incomingString = "";
}

void loop()
{
    if(Serial.available())
    {
        // Read a byte from the serial buffer.
        char incomingByte = (char)Serial.read();
        incomingString += incomingByte;

        // Checks for null termination of the string.
        if (incomingByte == '0') { //When 0 execute the code, the last byte is 0.
            if (incomingString == "10") { //The string is 1 and the last byte 0... because incomingString += incomingByte.
                servo.write(90);
            }
            incomingString = "";
        }
    }
}

2 个答案:

答案 0 :(得分:3)

引起我挑眉的一些事情:

serialPort1.Write("1");

这将写出完全一个字节1,但没有换行符,也没有尾随NUL-Byte。 但是你在这里等待一个额外的NUL字节:

if (incomingByte == '\0') {

您应该使用WriteLine代替Write,并等待\n而不是\0

这有两个副作用:

首先:如果配置了一些缓冲,那么有一定机会,而不是新线将缓冲数据推送到Arduino。确定你必须深入研究MSDN上的文档。

第二:这使您的协议仅限ASCII。这对于简化调试很重要。然后,您可以使用普通的终端程序,如Hyperterm或HTerm(编辑),甚至可以使用Arduino IDE本身的串行监视器(编辑)调试您的Arduino代码而不必担心C#代码中的错误。当Arduino代码工作时,您可以专注于C#部分。划分et impera。

编辑:在挖掘出我自己的Arduino之后,我注意到了另一件事:

incomingString += incomingByte;
....
if (incomingByte == '\n') { // modified this
  if(incomingString == "1"){

这当然不会按预期工作,因为字符串将包含&#34; 1 \ n&#34;在此刻。你可以比较&#34; 1 \ n&#34;或者在+=之后移动if行。

答案 1 :(得分:1)

您也可以尝试使用Firmata library - 这是在Arduino上使用标准固件并从.net管理它的更好方法

我相信,Firmata 2.0+支持I2C和伺服控制。

http://firmata.org/