C#与arduino串行通信

时间:2014-11-14 11:38:56

标签: c# serial-port arduino

我试图将我的arduino(leonardo)中的字符串发送到C#程序。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.Ports;

namespace ConsoleApplication2
{
class Program
{

    static void Main(string[] args)
    {
        SerialPort mySerialPort = new SerialPort("COM7");

        mySerialPort.BaudRate = 9600;
        mySerialPort.Parity = Parity.None;
        mySerialPort.StopBits = StopBits.One;
        mySerialPort.DataBits = 8;
        mySerialPort.Handshake = Handshake.None;


        mySerialPort.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);

        mySerialPort.Open();

        Console.WriteLine("Press any key to continue...");
        Console.WriteLine();
        Console.ReadKey();
        mySerialPort.Close();
    }

    static void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;
        string indata = sp.ReadExisting();
        Console.WriteLine("Data Received:");
        Console.Write(indata);
    }
}
}

这是我从msdn示例中复制的代码,试图理解它的作用。 我下面的arduino代码只是通过te com端口发送hello world,延迟为1000。

void setup ()
{

 Serial.begin(9600);

 }


void loop(){

 Serial.println("Hello World");
 delay(1000);
}

我的arduino就像我在C#程序中定义的那样使用COM7。当我运行bot程序时,C#程序永远不会进入datareceived事件处理程序。因此没有收到任何数据。我真的希望工作:)

亲切的问候

2 个答案:

答案 0 :(得分:0)

控制台应用程序没有消息循环,所以他们自然不会对事件做出响应。你有一个线程,它会在Console.ReadKey()被阻塞。使用串行端口的同步读取,或者如果您希望坚持基于事件的模型,请将此代码移动到基于Windows的应用程序。

对于同步示例,see this MSDN example

while (_continue)
{
    try
    {
        string message = _serialPort.ReadLine();
        Console.WriteLine(message);
    }
    catch (TimeoutException) { }
}

以上只是一个摘录 - 完整示例演示了设置超时值等等。

答案 1 :(得分:0)

我将代码切换到Windows窗体应用程序,它仍然无法正常工作。然后我找到了一个关于与C#进行串行通信的话题,关于arduino leonardo here

我必须这样做:

        serial.DtrEnable = true;
        serial.RtsEnable = true;

我认为我的问题已经解决了。