【问题标题】:Arduino and C# Serial Port "Crash"Arduino 和 C# 串口“崩溃”
【发布时间】:2016-11-25 14:50:13
【问题描述】:

我正在尝试在 Arduino Leonardo 和 C# 之间建立通信。

刚才,Arduino 的软件在串口上发送了一条简单的消息(循环中):

void setup() {
  Serial.begin(9600);
  analogReference(INTERNAL);
}
void loop() {
  Serial.println("test");
  delay(500);
}

C# 只尝试读取这些消息并在 shell 上打印它们:

public class Program
{
    private SerialPort mySerialPort;

    static void Main(string[] args)
    {
        Program p = new Program();
        Console.WriteLine("PORTS: " + String.Join(" ", p.getSerialPortsList())+ ", enter to start.");
        Console.Read();
        p.SerialRead("COM6");
    }

    public String[] getSerialPortsList()
    {
        string[] ports = SerialPort.GetPortNames();
        return ports;
    }

    public void SerialRead(String com)
    {
        mySerialPort = new SerialPort(com, 9600, Parity.None, 8, StopBits.One);
        Console.Read();
        Console.WriteLine("Incoming Data:");
        SerialRead sr = new SerialRead();
        Thread rs = new Thread(sr.StartRead);
        sr.SetMySerialPort(mySerialPort);
        rs.Start();
        while (!rs.IsAlive);
        Console.Read();
        sr.SetSuspendThread(true);
        rs.Join();
    }

}


public class SerialRead
{

    private Boolean suspendThread = false;
    SerialPort mySerialPort;

    public void StartRead()
    {
        mySerialPort.Open();
        Thread.Sleep(500);
        int i = 0;
        while (!suspendThread)
        { 
            i++;
            Console.WriteLine(i + ": " + mySerialPort.ReadLine());
            Thread.Sleep(500);
        }
    }

    public void SetMySerialPort(SerialPort mysp){ mySerialPort = mysp; }
    public void SetSuspendThread(Boolean a){ suspendThread = a; }

}

这个 C# 软件的输出取决于。如果我在 Arduino IDE 上使用串行监视器,那么我会正确接收字符串的流(每 500 毫秒一个)。 否则,C# 软件将冻结。有时,我会收到一些字符串,我们可以看到this figure;但几乎所有时候,该软件都没有给出任何字符串,正如我们看到的here。之后软件冻结(因此,如果我按下回车,shell 没有响应)。

您能否提出一个解决方案来获得流畅的字符串流,然后读取 Arduino 在串行端口上发送的每条消息?

我使用 Window 10 x64 作为操作系统和 COM6(它是 USB 2.0)。

【问题讨论】:

    标签: c# multithreading arduino serial-port


    【解决方案1】:

    我找到了解决方案并分享它以帮助遇到同样问题的人。 默认情况下,C# 不会激活 RTS and the DTR serial port。 因此,添加

    mySerialPort.DtrEnable = true;
    mySerialPort.RtsEnable = true;
    

    串口声明后,一切正常。

    【讨论】:

      【解决方案2】:

      这是一个很好的例子: Serial Port Polling and Data handling

      串行端口收到一个名为DataRecived 的事件,因此您不必休眠线程。
      像这样的:

      serialPort.DataReceived +=SerialPortDataReceived;
      
      
      private void SerialPortDataReceived(object sender, SerialDataReceivedEventArgs e)
      {
          Console.WriteLine(serialPort.ReadLine());
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多