2016-11-25 68 views
1

我想创建一个Arduino Leonardo和C#之间的通信。Arduino和C#串行端口“崩溃”

刚才,Arduino的软件发送一个简单的消息(环路)串行端口:

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

C#只尝试读取这些信息,并打印出来的外壳:

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)。

回答

0

我找到了解决方案,我分享它以帮助有同样问题的人。 C#不作为默认RTS and the DTR serial port激活。 因此,串口声明之后加入

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

,一切工作正常。