Winform上位机TCP客户端/服务端、串口通信
背景
日常练习,着急换工作,心态都快乱了。
工具
串口调试助手
网络调试助手
代码
客户端
cs
using Microsoft.VisualBasic.Logging;
using System.Net.Sockets;
using System.Text;
namespace TcpClientDemo
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
TcpClient tcpClient = new TcpClient();
/// <summary>
/// 连接服务端
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void connect_Click(object sender, EventArgs e)
{
if (!tcpClient.Connected)
{
tcpClient.Connect(IP.Text, int.Parse(PORT.Text));
//开启线程一直读取数据
Task.Run(() =>
{
while (true)
{
NetworkStream networkStream = tcpClient.GetStream();
if (networkStream != null)
{
byte[] datas = new byte[1024];
networkStream.Read(datas, 0, datas.Length);
this.BeginInvoke(new Action(() =>
{
log.Text = Encoding.UTF8.GetString(datas);
}));
}
}
});
}
}
/// <summary>
/// 发送数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void send_Click(object sender, EventArgs e)
{
NetworkStream networkStream = tcpClient.GetStream();
if (networkStream != null)
{
byte[] datas = Encoding.UTF8.GetBytes(log.Text);
networkStream.Write(datas, 0, datas.Length);
}
}
private void Form1_Load(object sender, EventArgs e)
{
IP.Text = "127.0.0.1";
PORT.Text = "8899";
}
}
}
服务端
cs
using Microsoft.VisualBasic.Logging;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace TcpSeverDemo
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//监听类
TcpListener listener = null;
//客户端
TcpClient handler = null;
NetworkStream stream = null;
bool isrun = false;
/// <summary>
/// 打开
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void openServer_Click(object sender, EventArgs e)
{
if (IP.Text.Trim().Length < 9 && Port.Text.Trim().Length == 0)
{
MessageBox.Show("IP和端口无效");
return;
}
listener = new TcpListener(IPAddress.Parse(IP.Text), int.Parse(Port.Text));
listener.Start();
isrun = true;
}
private void send_Click(object sender, EventArgs e)
{
if (stream != null)
{
byte[] buffer = Encoding.UTF8.GetBytes(log.Text);
//load已经连接,可以直接发送
stream.Write(buffer, 0, buffer.Length);
}
}
private void Form1_Load(object sender, EventArgs e)
{
IP.Text = "127.0.0.1";
Port.Text = "9800";
try
{
Task.Run(() =>
{
while (true)
{
if (isrun && listener != null)
{
//用来接收
handler = listener.AcceptTcpClient();
//创建网络流 已经连接
stream = handler.GetStream();
byte[] buffer = new byte[1024];
if (stream != null)
{
stream.Read(buffer, 0, buffer.Length);
this.BeginInvoke(new Action(() =>
{
log.Text = Encoding.UTF8.GetString(buffer);
}));
}
}
Thread.Sleep(50);
}
});
}
catch (Exception)
{
}
}
/// <summary>
/// 关闭
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
isrun = false;
if (listener != null)
{
listener.Stop();
}
}
}
}
串口
cs
using Microsoft.VisualBasic.Logging;
using System.Data;
using System.IO.Ports;
using System.Text;
namespace PortDemo
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
SerialPort serialPort = new SerialPort();
private void open_Click(object sender, EventArgs e)
{
try
{
if (!serialPort.IsOpen)
{
serialPort.Open();
serialPort.DataReceived += SerialPort_DataReceived;
}
}
catch (Exception ex)
{
log.Text = ex.Message;
}
}
private void read_Click(object sender, EventArgs e)
{
}
private void write_Click(object sender, EventArgs e)
{
serialPort.Write(log.Text);
}
private void Form1_Load(object sender, EventArgs e)
{
//导入一些基础参数
List<string> ports = SerialPort.GetPortNames().ToList();
foreach (var item in ports)
{
port.Items.Add(item);
}
List<int> baus = new List<int> { 9600, 115200 };
foreach (var item in baus)
{
bau.Items.Add(item);
}
List<int> databits = new List<int> { 6, 7, 8 };
foreach (var item in databits)
{
databit.Items.Add(item);
}
List<string> cks = new List<string> { "None" };
foreach (var item in cks)
{
check.Items.Add(item);
}
List<string> stops = new List<string> { "One" };
foreach (var item in stops)
{
stop.Items.Add(item);
}
try
{
serialPort.PortName = port.Text;
serialPort.BaudRate = int.Parse(bau.Text);
serialPort.Parity = Parity.None;
serialPort.DataBits = int.Parse(databit.Text);
serialPort.StopBits = StopBits.One;
}
catch (Exception ex)
{
log.Text = ex.Message;
}
}
private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte[] bytes = new byte[1024];
try
{
serialPort.Read(bytes, 0, bytes.Length);
string data = Encoding.UTF8.GetString(bytes);
this.Invoke(() =>
{
log.Text = data;
});
}
catch (Exception ex)
{
log.Text = ex.Message;
}
}
}
}
最简单的调用,之后会补充实际细节。这种基本不需要自己手动造轮子,除非重新开发,基本都是封装好的,会调用就可以,需要自己写的时候网上找找一堆。