2016-12-06 72 views
0

我想读取arduino中的简单传感器读数。 arduino连接到COM3(用于发送数据和编程arduino)。 C#程序非常简单,并尝试读取arduino发送的内容。 问题:当另一端(分别是C#或arduino)已打开它时,我无法打开C#或Arduino的COM3端口。只是在没有打开的情况下发送也不会产生任何结果。你应该如何“连接”它们?我的理解是两台设备都以相同的波特率打开端口,然后您可以发送和读取数据。当我尝试打开时,我会在C#端获得UnauthorizedAccess,或者在Arduino端获得“无法打开串行”。阅读通过Arduino发送到串行端口的信息用C#

Arduino的C代码:

#include <DHT.h> 

#define DHTPIN A4 
#define DHTTYPE DHT11 
#define THERPIN A0 

DHT dht(DHTPIN,DHTTYPE); 
String hum="Humidity:"; 
String temptext="Temp:"; 
String semi=";"; 

void setup() { 
    Serial.begin(9600); 
    dht.begin(); 
    pinMode(A0,INPUT); 
}  
void loop() { 
    float humidity = dht.readHumidity(); 
    delay(300); 
    float temp = dht.readTemperature(); 
    delay(300); 


    if (isnan(humidity)||isnan(temp)) 
    { 
     Serial.println("Fehler beim Lesen(NAN)"); 
     delay (5000); 
    }else 
    { 
     Serial.print(temp + semi); 
     Serial.print(humidity); 
     Serial.flush(); 
     delay(1000); 
    } 
} 

C#代码

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading; 
using System.IO.Ports; 

namespace ConsoleApplication3 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     {  
      SerialPort serialPort1; 
      serialPort1 = new SerialPort(); 
      serialPort1.PortName = "COM3"; 
      serialPort1.BaudRate = 9600; 
      serialPort1.DtrEnable = true; 
      REPEAT: 
      if (serialPort1.IsOpen) 
      { 
       string reading = serialPort1.ReadLine(); 
       Console.WriteLine(reading); 
       serialPort1.Close();     
      } 
      else 
      { 
       Console.WriteLine("closed,opening"); 
       serialPort1.Open(); 
       goto REPEAT;  
      }  
     } 
    } 
} 

在寻找解决方案一直是另一个PROGRAMM已经使用的COM端口,但是,这不是正是我所需要沟通?据我了解,显然,arduino必须使用与我的C#应用​​程序相同的COM端口。

谢谢

+0

,如果它没有打开,这意味着在PC别的东西有一个端口开放的端口,它不是Arduino的。我建议使用serialport类中的数据接收事件,每次在该端口上获得字符时它都会触发,并且您可以决定在那里使用它们。 – Baddack

回答

0

您的代码是永久打开和关闭串口。这是行不通的,因为当.NET代码关闭连接时,Windows内部将异步关闭端口。在港口实际关闭之前可能需要几秒钟的时间。这就是程序几乎立即阻止的原因。

公开赛在程序开始时的连接只有一次。

另外:避免不惜任何代价GOTO语句。埃德加·迪克斯特拉多年前写了一篇反对它使用的论文:Go To Statement Considered Harmful