-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMainPage.xaml.cs
More file actions
130 lines (122 loc) · 4.83 KB
/
MainPage.xaml.cs
File metadata and controls
130 lines (122 loc) · 4.83 KB
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
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using System.Threading.Tasks;
using Windows.Devices.Enumeration;
using Windows.Devices.SerialCommunication;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.Storage.Streams;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
namespace SerialDeviceExample
{
/// <summary>
/// Uma página vazia que pode ser usada isoladamente ou navegada dentro de um Quadro.
/// </summary>
public sealed partial class MainPage : Page
{
List<SerialConnectionInfo> _serialConnectionInfo = new List<SerialConnectionInfo>();
SerialDevice SerialDeviceComm;
private const uint _baudRate = 9600;
private const SerialParity _parity = SerialParity.None;
private const SerialStopBitCount _stopBitCount = SerialStopBitCount.One;
private const ushort _dataBit = 8;
private const SerialHandshake _serialHandshake = SerialHandshake.None;
private DataWriter dataWriter;
private DataReader dataReader;
public MainPage()
{
this.InitializeComponent();
}
private async Task RefreshListAsync()
{
_serialConnectionInfo.Clear();
cbListDevices.Items.Clear();
string _serialSelector = SerialDevice.GetDeviceSelector();
var infos = await DeviceInformation.FindAllAsync(_serialSelector);
foreach (var info in infos)
{
SerialConnectionInfo serialConnectionInfo = new SerialConnectionInfo();
serialConnectionInfo.PortName = info.Name;
serialConnectionInfo.PortID = info.Id;
_serialConnectionInfo.Add(serialConnectionInfo);
cbListDevices.Items.Add(info.Name);
}
}
private void RefreshList(object sender, RoutedEventArgs e)
{
_= RefreshListAsync();
}
private void click_SendString(object sender, RoutedEventArgs e)
{
_= SendStringDataAsync(tbSendString.Text);
}
private async Task SendStringDataAsync(string data)
{
dataWriter.WriteString(data);
await dataWriter.StoreAsync();
}
private void click_ConfigPort(object sender, RoutedEventArgs e)
{
_ = ConnectionAsync();
}
private async Task ConnectionAsync()
{
int _indexPort = 0;
foreach (var item in _serialConnectionInfo)
{
if (cbListDevices.SelectedItem.Equals(_serialConnectionInfo[_indexPort].PortName))
{
Task.Run(async () => { SerialDeviceComm = await SerialDevice.FromIdAsync(_serialConnectionInfo[_indexPort].PortID); }).Wait();
SerialDeviceComm.BaudRate = _baudRate;
SerialDeviceComm.Parity = _parity;
SerialDeviceComm.StopBits = _stopBitCount;
SerialDeviceComm.DataBits = _dataBit;
SerialDeviceComm.Handshake = _serialHandshake;
// This will make that regardless of receiving bytes or not it will read and continue.
SerialDeviceComm.ReadTimeout = TimeSpan.FromMilliseconds(uint.MaxValue); // Secret is here
dataWriter = new DataWriter(SerialDeviceComm.OutputStream);
dataReader = new DataReader(SerialDeviceComm.InputStream)
{
InputStreamOptions = InputStreamOptions.Partial
};
}
_indexPort++;
}
}
private void click_ReadSerial(object sender, RoutedEventArgs e)
{
tbReceivedSerial.Text = ReadSerialAsync(2000).Result;
}
private async Task<string> ReadSerialAsync(int timeOut)
{
string _tempData = "";
Stopwatch sw = new Stopwatch();
sw.Reset();
sw.Start();
while (sw.ElapsedMilliseconds < timeOut)
{
uint receivedStringSize = 0;
Task.Delay(50).Wait(); // Time to take some bytes
dataReader.InputStreamOptions = InputStreamOptions.Partial;
Task.Run(async () => { receivedStringSize = await dataReader.LoadAsync(200); }).Wait();
_tempData += dataReader.ReadString(receivedStringSize);
}
return _tempData;
}
}
public class SerialConnectionInfo
{
public string PortID { get; set; }
public string PortName { get; set; }
}
}