【发布时间】: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