Winform上位机TCP客户端/服务端、串口通信

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;
            }
        }
    }
}

最简单的调用,之后会补充实际细节。这种基本不需要自己手动造轮子,除非重新开发,基本都是封装好的,会调用就可以,需要自己写的时候网上找找一堆。

相关推荐
车载测试工程师14 分钟前
CAPL学习-AVB交互层-功能函数-控制类函数
学习·tcp/ip·以太网·capl·canoe
正运动技术19 分钟前
PC强实时运动控制(一):C#的EtherCAT总线初始化(上)
c#·运动控制·正运动技术·运动控制器·ethercat·正运动·运动控制内核
d111111111d1 小时前
在STM32中,中断服务函数的命名有什么要求?
笔记·stm32·单片机·嵌入式硬件·学习·c#
小心我捶你啊1 小时前
正向代理与反向代理两者的核心区别
网络·爬虫·网络协议
一只小鱼儿吖1 小时前
实时监测代理IP池质量并生成可视化报告的实战(以携趣代理API为例)
网络·网络协议·tcp/ip
Nerd Nirvana2 小时前
IPv6组播在DLMS协议中的应用——基础知识掌握
linux·运维·服务器·网络·网络协议·ipv6·dlms协议
福尔摩斯张2 小时前
TCP/IP网络编程深度解析:从Socket基础到高性能服务器构建(超详细)
linux·运维·服务器·开发语言·网络·网络协议·tcp/ip
Sleepy MargulisItG2 小时前
【Linux网络编程】传输层协议:TCP
linux·网络·tcp/ip
那我掉的头发算什么2 小时前
【javaEE】UDP与TCP核心原理深度解析:从“不可靠”到“稳如老狗”的进化之路
网络协议·tcp/ip·udp·java-ee·传输层协议
傻啦嘿哟2 小时前
隧道代理VS传统代理:IP切换效率的深度技术解析
网络·网络协议·tcp/ip