首页 > 学院 > 开发设计 > 正文

C#串口通信—传输文件测试

2019-11-17 02:43:33
字体:
来源:转载
供稿:网友

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();
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表