-
Notifications
You must be signed in to change notification settings - Fork 0
/
SerialHelp.cs
146 lines (113 loc) · 5.41 KB
/
SerialHelp.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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
using System.Globalization;
using System.IO.Ports;
using System.Text;
namespace AT_SCC;
public class SerialHelp {
// this class contains the functions and tasks for USART/UART/Serial Communications
public async Task SendStringAsync(SerialPort mySerialPort, string textToSend, bool loggingEnabled, string logFilePath, TextBox textBox) // task to send strings
{
mySerialPort.WriteLine(textToSend);
if (loggingEnabled)
{
var lines = File.ReadAllLines(logFilePath).ToList();
lines.Insert(0, $"{DateTime.Now:yyyy-MM-dd HH:mm:ss}: [SENT STRING]: {textToSend}\n");
File.WriteAllLines(logFilePath, lines);
}
await Task.Delay(int.Parse(textBox!.Text));
}
public void ReceiveStringAsync(SerialPort mySerialPort, TextBox receivedTextBox, bool loggingEnabled, string logFilePath) // task to receive strings
{
if (mySerialPort.BytesToRead > 0) {
receivedTextBox.Text = mySerialPort.ReadLine();
if (loggingEnabled)
{
var lines = File.ReadAllLines(logFilePath).ToList();
lines.Insert(0, $"{DateTime.Now:yyyy-MM-dd HH:mm:ss}: [RECEIVED STRING]: {receivedTextBox.Text}\n");
File.WriteAllLines(logFilePath, lines);
}
if (receivedTextBox.TextLength >= receivedTextBox.Width * 3)
{
receivedTextBox.Text = receivedTextBox.Text[(receivedTextBox.TextLength - receivedTextBox.Width * 3)..];
}
}
}
public async Task SendASCIIAsync(byte[] hexBytes, SerialPort mySerialPort, CheckBox logging_check, TextBox textBox, string LogFilePath) // task to send ASCII or hex values
{
foreach (var hexByte in hexBytes)
{
if (logging_check.Checked)
{
var logFilePath = LogFilePath;
var lines = File.ReadAllLines(logFilePath).ToList();
lines.Insert(0, $"{DateTime.Now:yyyy-MM-dd HH:mm:ss}: [SENT ASCII/HEX]: {hexByte:X2}\n");
File.WriteAllLines(logFilePath, lines);
}
mySerialPort.Write(new byte[] { hexByte }, 0, 1);
await Task.Delay(int.Parse(textBox!.Text));
}
}
public void ReceiveASCIIAsync(SerialPort mySerialPort, CheckBox logging_check, TextBox[] receivedTextBox, int i, string LogFilePath)
{
receivedTextBox[i].Text = mySerialPort.ReadExisting();
if (logging_check.Checked)
{
var logFilePath = LogFilePath;
var lines = File.ReadAllLines(logFilePath).ToList();
lines.Insert(0, $"{DateTime.Now:yyyy-MM-dd HH:mm:ss}: [RECEIVED ASCII/HEX]: {receivedTextBox[i]!.Text}\n");
File.WriteAllLines(logFilePath, lines);
}
}
public async Task SendBytesAsync(SerialPort serialPort, IEnumerable<TextBox> textBoxes, CheckBox logging_check, string LogFilePath, TextBox textBoxDelay) // task to send bytes or byte collections
{
foreach (var textBox in textBoxes)
{
if (!string.IsNullOrWhiteSpace(textBox.Text))
{
var inputValues = textBox.Text.Split(' ');
var bytesToSend = new List<byte>(); // adds data to the list to send
foreach (var value in inputValues)
{
if (byte.TryParse(value, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out var byteValue))
{
bytesToSend.Add(byteValue);
}
else // if data is unavailable or not correct type, throw error
{
MessageBox.Show($"Error: Unable to parse byte value '{value}'", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
if (logging_check.Checked)
{
var logFilePath = LogFilePath;
var lines = File.ReadAllLines(logFilePath).ToList();
lines.Insert(0, $"{DateTime.Now:yyyy-MM-dd HH:mm:ss}: [SENT BYTE/BYTE COLLECTION]: {byteValue}\n");
File.WriteAllLines(logFilePath, lines);
}
}
serialPort.Write(bytesToSend.ToArray(), 0, bytesToSend.Count);
await Task.Delay(int.Parse(textBoxDelay!.Text));
}
}
}
public void ReceiveBytesAsync(SerialPort mySerialPort, TextBox[]? textBoxArray, int i, CheckBox logging_check, string LogFilePath) // task to receive bytes or byte collections
{
if (mySerialPort.BytesToRead > 0) {
var bytesReceived = new List<byte>();
var receivedText = new StringBuilder();
var receivedTextBox = textBoxArray![i];
// read bytes from port and convert to text
var b = (byte)mySerialPort.ReadByte();
bytesReceived.Add(b);
receivedText.Append(b + " ");
receivedTextBox.Text = Convert.ToString(receivedText);
// create a new textbox to display the received bytes
if (logging_check.Checked)
{
var logFilePath = LogFilePath;
var lines = File.ReadAllLines(logFilePath).ToList();
lines.Insert(0, $"{DateTime.Now:yyyy-MM-dd HH:mm:ss}: [RECEIVED BYTE/BYTE COLLECTION]: {receivedText}\n");
File.WriteAllLines(logFilePath, lines);
}
}
}
}