2016-12-06 5 views
0

Я пытаюсь прочитать простую считывание датчика с ардуино. Ардуино подключается к COM3 (используется для отправки данных и программирования arduino). Программа C# очень проста и пытается прочитать, что отправляет ардуино. Проблема: я не могу открыть COM3-порт с C# или arduino, когда другая сторона (C# или arduino соответственно) уже открыла его. Просто отправка без открытия не дает никаких результатов. Как вы должны «подключить» их? Я понимаю, что оба устройства открывают порт с той же скоростью, а затем вы можете отправлять и читать данные. Когда я пытаюсь открыть, я получу UnauthorizedAccess на стороне C# или «не может открыть серийный номер» на стороне arduino.Чтение Информация, отправленная arduino в Serial Port с 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;  
      }  
     } 
    } 
} 

При поиске решения всегда, что другая программа уже с помощью COM-порта, но это не то, что именно то, что мне нужно было общаться? Насколько я понимаю, ардуино должен использовать тот же COM-порт, что и мое приложение C#.

Благодаря

+0

Если он не может открыть порт, что означает, что что-то еще на ПК имеет порт, открытый, это не ардуино. Я бы рекомендовал использовать полученные данные в классе serialport, и он будет срабатывать каждый раз, когда вы получите символы на этом порту, и вы можете решить, что с ними делать. – Baddack

ответ

0

Ваш код открытия и закрытия последовательного порта постоянно. Это не работает, потому что когда код .NET закрывает соединение, Windows внутренне закрывает порт асинхронно. Это может занять несколько секунд, прежде чем порт будет закрыт. Вот почему программа почти сразу блокирует.

Откройте соединение только один раз в начале вашей программы.

Кроме того: избегайте заявлений GOTO любой ценой. Эдгар Дейкстра написал статью против ее использования много лет назад: Go To Statement Considered Harmful.