簡體   English   中英

Arduino和C#串口“崩潰”

[英]Arduino and C# Serial Port “Crash”

我正在嘗試在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上使用串行監視器,那么我會正確接收字符串的流(每500ms一個)。 否則,C#軟件凍結。 有時,我收到一些字符串,因為我們可以看到這個數字 ; 但幾乎所有時間,軟件都沒有給出任何字符串,正如我們在這里看到的那樣。 之后,軟件凍結(因此,如果我按下輸入,shell不響應)。

你能建議一個解決方案,以獲得流暢的字符串流,並且 - 結果 - 讀取Arduino在串口上發送的每條消息?

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

我找到了解決方案並分享它以幫助遇到同樣問題的人。 C#不會默認激活RTS和DTR串行端口 因此,添加

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

串口聲明后,一切正常。

這是一個非常好的例子: 串行端口輪詢和數據處理

串口有一個名為DataRecived的事件,所以你不必睡覺你的線程。
像這樣的東西:

serialPort.DataReceived +=SerialPortDataReceived;


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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM