UA3REO-DDC-Transceiver/Stuff/WIFIClient/mainForm.cs

162 wiersze
5.4 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;
using System.Threading;
using System.Net.Sockets;
namespace UA3REO_WIFIClient
{
public partial class mainForm : Form
{
public static SerialPort port = new SerialPort();
private Thread mainThread = new Thread(new ThreadStart(thread_loop));
public static TcpClient tcp_client = new TcpClient();
public static System.Windows.Forms.Label statusLabelStatic;
public static string address = "";
public mainForm()
{
InitializeComponent();
statusLabelStatic = statusLabel;
}
private void mainForm_Load(object sender, EventArgs e)
{
scanPorts();
addressTextBox.Text = Properties.Settings.Default.address;
portComboBox.Text = Properties.Settings.Default.com_port;
}
private void scanPorts()
{
portComboBox.Items.Clear();
foreach (string lport in SerialPort.GetPortNames())
portComboBox.Items.Add(lport);
}
private void portComboBox_DropDown(object sender, EventArgs e)
{
scanPorts();
}
private void mainForm_FormClosing(object sender, FormClosingEventArgs e)
{
mainThread.Abort();
Properties.Settings.Default.address = addressTextBox.Text;
Properties.Settings.Default.com_port = portComboBox.Text;
Properties.Settings.Default.Save();
if (port.IsOpen)
port.Close();
}
private void connectButton_Click(object sender, EventArgs e)
{
if (!port.IsOpen)
{
port = new SerialPort(portComboBox.SelectedItem.ToString(), 38400, Parity.None, 8);
port.ReadTimeout = 5000;
port.Encoding = Encoding.ASCII;
port.ReadBufferSize = 65000;
try
{
port.Open();
port.ReadExisting();
}
catch
{
statusLabel.Text = "Ошибка открытия порта";
}
}
if (tcp_client.Connected) tcp_client.Close();
try
{
tcp_client.ReceiveTimeout = 5000;
tcp_client.SendTimeout = 5000;
tcp_client.NoDelay = true;
}
catch { }
connect();
address = addressTextBox.Text;
try { mainThread.Start(); } catch { }
}
public static void setStatus(string text)
{
try
{
statusLabelStatic.Invoke((MethodInvoker)delegate
{
// Running on the UI thread
Console.WriteLine(text);
statusLabelStatic.Text = text;
});
}
catch { }
}
public static void connect()
{
try
{
setStatus("Соединяюсь с трансивером");
tcp_client = new TcpClient();
tcp_client.Connect(address, 6784);
setStatus("Соединение установлено, жду команды");
}
catch (Exception e)
{
Console.WriteLine(e.Message);
setStatus(e.Message);
}
}
public static void thread_loop()
{
ASCIIEncoding ascii = new ASCIIEncoding();
string buffer = "";
while (true)
{
if (port.BytesToRead > 0 || buffer.IndexOf(";") > 0)
{
buffer += port.ReadExisting();
if (buffer.IndexOf(";") > 0)
{
string command = buffer.Substring(0, buffer.IndexOf(";"));
buffer = buffer.Substring(buffer.IndexOf(";") + 1);
command = command.Trim()+"\n";
if (command != "")
{
setStatus("Получена команда: " + command.Trim());
byte[] send_buffer = ascii.GetBytes(command);
try
{
Console.WriteLine("Отправляю на сервер: " + ascii.GetString(send_buffer).Trim());
tcp_client.GetStream().Write(send_buffer, 0, command.Length);
}
catch
{ connect(); }
}
}
}
if(tcp_client.Connected && tcp_client.GetStream().DataAvailable)
{
int len = tcp_client.Available;
byte[] read_buffer = new byte[len];
tcp_client.GetStream().Read(read_buffer, 0, len);
string answer = ascii.GetString(read_buffer);
setStatus("Получен ответ: " + answer);
port.Write(answer);
}
Thread.Sleep(1);
}
}
}
}