SerialPort.ReadLine()不会从Arduino发送的USB COM端口读取数据

SerialPort.ReadLine()不会从Arduino发送的USB COM端口读取数据

问题描述:

我使用Arduino将文本数据发送到COM15(通过微型USB)。在我的桌面上,我试图从我的C#应用​​程序中读取数据。但是,当我运行它时,控制台不显示任何内容,并且程序在“string s = myPort.ReadLine()”行处出现问题。SerialPort.ReadLine()不会从Arduino发送的USB COM端口读取数据

以下是我的C#程序:

static void Main(string[] args) 
{ 
    var myPort = new SerialPort("COM15", 115200); 
    myPort.Open(); 
    while (true) 
    { 
     var s = myPort.ReadLine(); // execution stucks here waiting forever! 
     Console.WriteLine(s); 
    } 
} 

以下是Arduino的代码(将数据发送到COM15):

int counter = 1; 
void setup() { 
    // put your setup code here, to run once: 
Serial.begin(115200); 
} 

void loop() { 
    // put your main code here, to run repeatedly: 
Serial.println(" Data Loop = " + String(counter)); 
counter++; 
delay(500); 
} 

Arduino的串行监控并显示数据在COM15正在接收。我还尝试了其他读取COM端口的软件,并验证数据在端口可用。

通过myPort.Open()命令之前添加以下行,我设法解决我的问题,并从COM成功读取:

myPort.DtrEnable = true; 

你可能会问什么是DTR标志。 DTR代表“数据终端就绪”和根据Wikipedia

数据终端就绪(DTR)是在RS-232串行 通信的控制信号,从数据终端设备(DTE)发送,例如 作为计算机到数据通信设备(DCE),例如 调制解调器,以指示终端已准备好进行通信,并且调制解调器可以发起通信信道。

您没有正确读取端口。

下面是如何正确读取comport数据输入的示例。

public static void Main() 
{ 
    SerialPort mySerialPort = new SerialPort("COM1"); 

    mySerialPort.BaudRate = 9600; 
    mySerialPort.Parity = Parity.None; 
    mySerialPort.StopBits = StopBits.One; 
    mySerialPort.DataBits = 8; 
    mySerialPort.Handshake = Handshake.None; // Some device needs a different handshake. 

    mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); 

    mySerialPort.Open(); 

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

private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) 
{ 
    SerialPort sp = (SerialPort)sender; 
    string indata = sp.ReadExisting(); 
    Debug.Print("Data Received:"); 
    Debug.Print(indata); 
}