Ok. Hier mein C#-Arduino-Kommunikations-Programm.
-Es ist zugeschitten auf das oben gepostete Arduino-Programm.
-Es ist ein einfaches Konsolenprogramm, das sich den Arduino-Port selbst sucht.
-Im Projektmappenexplorer von Visual-Studio:
- Rechtsklick auf das Projekt im Projektexplorer
- Hinzufügen -> Verweis
- Haken bei System.Management hinzufügen (Framework)
--- Hauptprogramm ---
Code:
using System;
using System.IO.Ports;
using System.Linq;
using System.Threading;
namespace ConnectToArduino
{
class Program
{
static void Main(string[] args)
{
#region --- Start ---
ConnectionManager manager = new ConnectionManager();
SerialPort arduinoPort;
if (manager.SerialPorts.Count > 0)
{
arduinoPort = manager.SerialPorts.ElementAt(0).Value;
Console.WriteLine("Arduino found: {0}\n", manager.SerialPorts.ElementAt(0).Key);
}
else
{
Console.WriteLine("No Arduino found!");
Console.WriteLine("<Press Key to exit program>");
Console.ReadKey();
return;
}
try
{
arduinoPort.Open();
}
catch (Exception)
{
Console.WriteLine("Port already open!");
Console.WriteLine("<Press Key to exit program>");
Console.ReadKey();
return;
}
#endregion
#region --- Send and Receive ---
arduinoPort.Write("1");
Thread.Sleep(100);
Console.WriteLine("Response from Arduino after sending \"1\": {0}", arduinoPort.ReadLine());
Thread.Sleep(1000);
arduinoPort.Write("0");
Thread.Sleep(100);
Console.WriteLine("Response from Arduino after sending \"0\": {0}", arduinoPort.ReadLine());
Console.WriteLine("<Press Key to exit program>");
Console.ReadKey();
#endregion
#region --- End Program ---
try { arduinoPort.Close(); }
catch (Exception){ return; }
#endregion
}
}
}
--- ConnectionManager ---
Code:
using System.Collections.Generic;
using System.Diagnostics;
using System.IO.Ports;
using System.Linq;
using System.Management;
namespace ConnectToArduino
{
public sealed class ConnectionManager
{
public Dictionary<string, SerialPort> SerialPorts { get; private set; }
public ConnectionManager()
{
FindArduinoDevices();
}
private void FindArduinoDevices()
{
var dict = new Dictionary<string, SerialPort>();
try
{
foreach (ManagementObject device in
new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_SerialPort").Get())
{
if (!device["PNPDeviceID"].ToString().Contains("VID_2341")) continue;
var port = new SerialPort();
var config = device.GetRelated("Win32_SerialPortConfiguration")
.Cast<ManagementObject>().ToList().FirstOrDefault();
port.PortName = device["DeviceID"].ToString();
port.BaudRate = (config != null)
? int.Parse(config["BaudRate"].ToString())
: int.Parse(device["MaxBaudRate"].ToString());
dict.Add(device["Description"].ToString(), port);
}
SerialPorts = dict;
}
catch (ManagementException mex)
{
Debug.WriteLine(@"An error occurred while querying for WMI data: " + mex.Message);
}
}
}
}
Lesezeichen