【问题标题】:Reading Info sent by arduino to Serial Port with C#使用 C# 读取 arduino 发送到串行端口的信息
【发布时间】:2016-12-06 18:46:12
【问题描述】:

我正在尝试从 arduino 读取简单的传感器读数。 arduino 连接到 COM3(用于发送数据和对 arduino 进行编程)。 C# 程序非常简单,它会尝试读取 arduino 发送的内容。 问题:当对方(分别为 C# 或 arduino)已经打开 COM3 端口时,我无法用 C# 或 arduino 打开 COM3 端口。不打开就发送也不会产生任何结果。你应该如何“连接”它们?我的理解是两个设备都以相同的波特率打开端口,然后您可以发送和读取数据。当我尝试打开时,我会在 C# 端获得 UnauthorizedAccess 或在 arduino 端获得“无法打开串行”。

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 端口,但这不正是我需要沟通的吗?显然,据我所知,arduino 必须使用与我的 C# 应用程序相同的 COM-Port。

谢谢

【问题讨论】:

  • 如果它无法打开端口,这意味着 pc 上的其他东西打开了该端口,它不是 arduino。我建议在串口类上使用 data received 事件,每次你在该端口上获得字符时它都会触发,你可以在那里决定如何处理它们。

标签: c# c arduino serial-port


【解决方案1】:

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

在程序开始时只打开一次连接。

此外:不惜一切代价避免 GOTO 语句。 Edgar Dijkstra 多年前写了一篇反对使用它的论文:Go To Statement Considered Harmful

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    相关资源
    最近更新 更多