C#串口通信—传输文件测试
生活随笔
收集整理的這篇文章主要介紹了
C#串口通信—传输文件测试
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
說(shuō)明:該程序可能不具備實(shí)用性,僅測(cè)試用。
一、使用虛擬串口工具VSPD虛擬兩個(gè)串口COM1和COM2
二、約定
占一個(gè)字節(jié),代碼如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text;namespace COMClient {/// <summary>/// 約定/// </summary>public enum Protocol{Client端發(fā)送文件名 = 0,Client端發(fā)送數(shù)據(jù)塊 = 1,Client端發(fā)送最后一個(gè)數(shù)據(jù)塊 = 2,Server端本次接收完畢 = 3,Server端結(jié)束 = 4} } View Code三、功能說(shuō)明:
?COMClient程序監(jiān)聽(tīng)COM1串口,COMServer程序監(jiān)聽(tīng)COM2串口。COMClient先擇文件,發(fā)送,COMServer接收文件。數(shù)據(jù)分多次發(fā)送,每次發(fā)送的數(shù)據(jù),通過(guò)第一個(gè)字節(jié)判斷發(fā)送的這段數(shù)據(jù)是干啥的,后面的字節(jié)是數(shù)據(jù)本身。
四、COMClient端發(fā)送文件
代碼:
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 Form1public Form1(){InitializeComponent();}#endregion#region Form1_Loadprivate void Form1_Load(object sender, EventArgs e){serialPort = new SerialPort("COM1");serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);serialPort.Open();}#endregion#region btnConn_Clickprivate 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端發(fā)送文件名);bList.AddRange(ASCIIEncoding.UTF8.GetBytes(openFileDialog1.FileName));byte[] bArr = bList.ToArray();serialPort.Write(bArr, 0, bArr.Length);}}#endregion/// <summary>/// 接收串口數(shù)據(jù)事件/// </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端發(fā)送數(shù)據(jù)塊;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端發(fā)送最后一個(gè)數(shù)據(jù)塊;fs.Read(bArr, 1, bArr.Length - 1);index++;serialPort.Write(bArr, 0, bArr.Length);}break;case (int)Protocol.Server端結(jié)束:index = 0;double totalSeconds = DateTime.Now.Subtract(dt).TotalSeconds;MessageBox.Show("完成,耗時(shí)" + 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 Form1public Form1(){InitializeComponent();}#endregion#region Form1_Loadprivate void Form1_Load(object sender, EventArgs e){serialPort = new SerialPort("COM2");serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);serialPort.Open();}#endregion/// <summary>/// 接收串口數(shù)據(jù)事件/// </summary>public void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e){if (serialPort.BytesToRead == 0) return;#region 接收數(shù)據(jù)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();#endregionswitch (bt){case (int)Protocol.Client端發(fā)送文件名:string path = ASCIIEncoding.UTF8.GetString(receiveData);string fileName = Path.GetFileName(path);fs = new FileStream(@"d:\_臨時(shí)文件\COM測(cè)試" + 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端發(fā)送數(shù)據(jù)塊: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端發(fā)送最后一個(gè)數(shù)據(jù)塊:fs.Write(receiveData, 0, receiveData.Length);fs.Flush();bArr = new byte[1];bArr[0] = (int)Protocol.Server端結(jié)束;serialPort.Write(bArr, 0, bArr.Length);fs.Close();fs.Dispose();break;}}} } View Code?
轉(zhuǎn)載于:https://www.cnblogs.com/s0611163/p/4137943.html
總結(jié)
以上是生活随笔為你收集整理的C#串口通信—传输文件测试的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 目标检测之行人检测(Pedestrian
- 下一篇: 聊天的时间显示