gpt4 book ai didi

c# - 用C#读取arduino发送到串口的信息

转载 作者:行者123 更新时间:2023-11-30 16:53:06 25 4
gpt4 key购买 nike

我正在尝试从 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 端口。

谢谢

最佳答案

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

仅在程序启动时打开一次连接。

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

关于c# - 用C#读取arduino发送到串口的信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41002611/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com