zoukankan      html  css  js  c++  java
  • C#串口通信—传输文件测试

    说明:该程序可能不具备实用性,仅测试用。

    一、使用虚拟串口工具VSPD虚拟两个串口COM1和COM2

    二、约定

    占一个字节,代码如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace COMClient
    {
        /// <summary>
        /// 约定
        /// </summary>
        public enum Protocol
        {
            Client端发送文件名 = 0,
            Client端发送数据块 = 1,
            Client端发送最后一个数据块 = 2,
    
            Server端本次接收完毕 = 3,
            Server端结束 = 4
        }
    }
    View Code

    三、功能说明:

     COMClient程序监听COM1串口,COMServer程序监听COM2串口。COMClient先择文件,发送,COMServer接收文件。数据分多次发送,每次发送的数据,通过第一个字节判断发送的这段数据是干啥的,后面的字节是数据本身。

    四、COMClient端发送文件

    代码:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.IO.Ports;
    using System.IO;
    using System.Threading;
    
    namespace COMClient
    {
        public partial class Form1 : Form
        {
            #region 变量
            /// <summary>
            /// 串口资源
            /// </summary>
            private static SerialPort serialPort = null;
            /// <summary>
            /// 文件
            /// </summary>
            private static FileStream fs = null;
            private static long index = 0;
            private static long blockCount;
            private static int size = 4095;
            private static DateTime dt;
            #endregion
    
            #region Form1
            public Form1()
            {
                InitializeComponent();
            }
            #endregion
    
            #region Form1_Load
            private void Form1_Load(object sender, EventArgs e)
            {
                serialPort = new SerialPort("COM1");
                serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);
                serialPort.Open();
            }
            #endregion
    
            #region btnConn_Click
            private void btnConn_Click(object sender, EventArgs e)
            {
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    dt = DateTime.Now;
                    fs = new FileStream(openFileDialog1.FileName, FileMode.Open, FileAccess.Read);
                    blockCount = (fs.Length - 1) / size + 1;
    
                    List<byte> bList = new List<byte>();
                    bList.Add((int)Protocol.Client端发送文件名);
                    bList.AddRange(ASCIIEncoding.UTF8.GetBytes(openFileDialog1.FileName));
                    byte[] bArr = bList.ToArray();
                    serialPort.Write(bArr, 0, bArr.Length);
                }
            }
            #endregion
    
            /// <summary>
            /// 接收串口数据事件
            /// </summary>
            public void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                if (serialPort.BytesToRead == 0) return;
    
                int bt = serialPort.ReadByte();
    
                switch (bt)
                {
                    case (int)Protocol.Server端本次接收完毕:
                        if (index != blockCount - 1)
                        {
                            byte[] bArr = new byte[size + 1];
                            bArr[0] = (int)Protocol.Client端发送数据块;
                            fs.Read(bArr, 1, size);
                            index++;
                            Thread.Sleep(1);
                            serialPort.Write(bArr, 0, bArr.Length);
                        }
                        else
                        {
                            byte[] bArr = new byte[fs.Length - (size * index) + 1];
                            bArr[0] = (int)Protocol.Client端发送最后一个数据块;
                            fs.Read(bArr, 1, bArr.Length - 1);
                            index++;
                            serialPort.Write(bArr, 0, bArr.Length);
                        }
                        break;
                    case (int)Protocol.Server端结束:
                        index = 0;
                        double totalSeconds = DateTime.Now.Subtract(dt).TotalSeconds;
                        MessageBox.Show("完成,耗时" + totalSeconds + "秒,速度" + (fs.Length / 1024.0 / totalSeconds).ToString("#.0") + "KB/S");
                        fs.Close();
                        fs.Dispose();
                        break;
                }
            }
    
        }
    }
    View Code

    五、COMServer端接收文件

    代码:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.IO.Ports;
    using System.IO;
    
    namespace COMServer
    {
        public partial class Form1 : Form
        {
            #region 变量
            /// <summary>
            /// 串口资源
            /// </summary>
            private static SerialPort serialPort = null;
            /// <summary>
            /// 文件
            /// </summary>
            private static FileStream fs = null;
            #endregion
    
            #region Form1
            public Form1()
            {
                InitializeComponent();
            }
            #endregion
    
            #region Form1_Load
            private void Form1_Load(object sender, EventArgs e)
            {
                serialPort = new SerialPort("COM2");
                serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);
                serialPort.Open();
            }
            #endregion
    
            /// <summary>
            /// 接收串口数据事件
            /// </summary>
            public void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                if (serialPort.BytesToRead == 0) return;
    
                #region 接收数据
                int bt = serialPort.ReadByte();
                List<byte> bList = new List<byte>();
                while (serialPort.BytesToRead > 0)
                {
                    byte[] bArr = new byte[serialPort.BytesToRead];
                    serialPort.Read(bArr, 0, bArr.Length);
                    bList.AddRange(bArr);
                }
                byte[] receiveData = bList.ToArray();
                #endregion
    
                switch (bt)
                {
                    case (int)Protocol.Client端发送文件名:
                        string path = ASCIIEncoding.UTF8.GetString(receiveData);
                        string fileName = Path.GetFileName(path);
                        fs = new FileStream(@"d:\_临时文件COM测试" + fileName, FileMode.Create, FileAccess.Write);
                        byte[] bArr = new byte[1];
                        bArr[0] = (int)Protocol.Server端本次接收完毕;
                        serialPort.Write(bArr, 0, bArr.Length);
                        break;
                    case (int)Protocol.Client端发送数据块:
                        fs.Write(receiveData, 0, receiveData.Length);
                        fs.Flush();
                        bArr = new byte[1];
                        bArr[0] = (int)Protocol.Server端本次接收完毕;
                        serialPort.Write(bArr, 0, bArr.Length);
                        break;
                    case (int)Protocol.Client端发送最后一个数据块:
                        fs.Write(receiveData, 0, receiveData.Length);
                        fs.Flush();
                        bArr = new byte[1];
                        bArr[0] = (int)Protocol.Server端结束;
                        serialPort.Write(bArr, 0, bArr.Length);
                        fs.Close();
                        fs.Dispose();
                        break;
                }
            }
    
        }
    }
    View Code
  • 相关阅读:
    Springboot学习七 spring的一些注解
    Spring boot 学习六 spring 继承 mybatis (基于注解)
    Spring boot 学习 五:domain的定义
    Spring boot 学习 四:spring boot 配置文件 application.yml
    python学习(十九) 查看Python的安装路径
    docker 学习(九) docker部署静态网站
    maven学习9 关于maven一些參數
    docker 学习(八) docker file
    HTTP VS HTTPS
    【Python】【亲测好用】安装第三方包报错:AttributeError:'module' object has no attribute 'main'
  • 原文地址:https://www.cnblogs.com/s0611163/p/4137943.html
Copyright © 2011-2022 走看看