-
Notifications
You must be signed in to change notification settings - Fork 0
/
SerialPortWrapper.cs
96 lines (83 loc) · 2.6 KB
/
SerialPortWrapper.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Text;
using System.Threading.Tasks;
namespace InoEEPROMProgrammer
{
public class SerialPortWrapper
{
private readonly SerialPort _port;
public int BytesToRead => _port.BytesToRead;
public int BytesToWrite => _port.BytesToWrite;
public SerialPortWrapper(string portName)
{
_port = new SerialPort(portName);
_port.ReadTimeout = 10000;
_port.WriteTimeout = 10000;
_port.Handshake = Handshake.None;
}
public static IReadOnlyCollection<string> ListPorts()
{
return SerialPort.GetPortNames();
}
public bool Open()
{
_port.BaudRate = 115200;
_port.DtrEnable = true;
_port.RtsEnable = true;
_port.Open();
while (!_port.IsOpen) ;
Console.WriteLine("Waiting for Arduino to boot up after (probable) reboot...");
Task.Delay(2000).Wait();
_port.DiscardInBuffer();
_port.DiscardOutBuffer();
Console.WriteLine("Trying!");
WriteByte(I2CCommands.PING, false);
return ReadByte() == I2CCommands.PONG;
}
public byte ReadByte()
{
return ReadBytes(1)[0];
}
public byte[] ReadBytes(int count)
{
if (!_port.IsOpen)
throw new InvalidOperationException("Port is not opened!");
byte[] buffer = new byte[count];
int receivedBytes = 0;
while(receivedBytes < count)
{
receivedBytes += _port.Read(buffer, 0, count);
}
return buffer;
}
public string ReadString(int count)
{
var data = ReadBytes(count);
return Encoding.UTF8.GetString(data);
}
public void WriteByte(byte data, bool checkForAck = true)
{
WriteBytes(new[] { data }, checkForAck);
}
public void WriteBytes(byte[] data, bool checkForAck = true)
{
_port.Write(data, 0, data.Length);
if (checkForAck)
{
byte response = 0x00;
try
{
response = ReadByte();
}
catch (TimeoutException)
{ }
if (response != I2CCommands.ACK)
{
throw new ApplicationException("Interface didn't respond with ACK!");
}
}
}
}
}