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

一、使用虚拟串口工具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 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端发送文件名);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 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>/// 接收串口数据事件/// </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();#endregionswitch (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

转载于:https://www.cnblogs.com/s0611163/p/4137943.html

C#串口通信—传输文件测试相关推荐

  1. PC机之间串口通信传输文件

    参考资料 本文内容:本文主要介绍如何实现两电脑之间的串口通信.将两台笔记本电脑,借助 usb转TTL 模块和杜邦线,建立起串口连接.然后用串口助手等工具软件(带文件传输功能)将一台笔记本上的一个大文件 ...

  2. 两个串口之间传输文件

    一.串口连接 将两个USB TO TTL用两根杜邦线连接,将两个USB TO TTL的RX,TX引脚交叉连接,然后将两个USB TO TTL接口接在电脑上. 二.传输文件 1.打开两个串口助手 波特率 ...

  3. uart串口通信传输协议

    一.Uart串口通信 uart串口通信是一种异步串行全双工通信方式,tx端用于数据发送:rx端用于数据接收.信号线在空闲时为高电平. 异步通信是按字符传输的.每传输一个字符就用起始位来收.发双方的同步 ...

  4. 庆祝一下,基于JXTA的P2P文件共享传输文件测试成功。

    jxta.org上也有一个资源共享的项目,jxta-cm,但是这个项目作的不够好. 我重新设计了传输协议,参考了BT的传输协议. 存储本地信息,不像jxta-cm那样简单,序列化一个本地磁盘文件,而是 ...

  5. java实现串口ymodem 传输文件_活久见!Jmeter也能实现文件传输和发送邮件啦

    Jmeter实现文件处理和邮件发送 Jmeter除了支持Http协议以外,还支持多种其他协议,包括FTP协议和SMTP/POP3协议,可以用于文件上传下载和邮件发送.Jmeter内置FTP Sampl ...

  6. UART串口通信(回环测试)

    一 UART串口通信简介 UART(Universal Asynchronous Receiver-Transmitter)是采用异步串行通信方式的通用异步收发传输器,在发送数据时将并行数据转换为串行 ...

  7. 实现串口通信数据帧打包与解析,串口通信可靠传输,屡试不爽的数据封包与状态机数据解析程序

    提示:本文所述内容为实际项目中多次实践的成果,稳定可靠,且方便移植,适合多种通信场景. 文章目录 前言 一.实现思路 一.发送端 1.1 实现过程 1.2 实现代码 1.2.1 定义数据发送函数 1. ...

  8. WIN32API串口接收数据简单测试

    进行简单的API中一部分关于串口通信函数的测试,为以后的上位机编写做准备. 下面是一部分从网上和msdn整理的函数说明: ReadFile: BOOL ReadFile (    HANDLE hFi ...

  9. xmodem java_Xmodem XMODEM协议是一种串口通信中广泛用到的异步文件传输协议 联合开发网 - pudn.com...

    Xmodem 所属分类:串口编程 开发工具:Java 文件大小:3KB 下载次数:6 上传日期:2017-11-02 21:50:52 上 传 者:雄霸天下19 说明:  XMODEM协议是一种串口通 ...

最新文章

  1. 面试官:RabbitMQ本身不支持延迟队列,那你给我实现一个?
  2. 监控告警满飞天,Netflix 运维如何做到在家睡到自然醒...
  3. 端口偷窃(Port Stealing)技术
  4. mysql post 中文乱码_mysql/mariaDB中文乱码问题的处理
  5. 数据结构实验之栈四:括号匹配
  6. 什么!卷积要旋转180度?!
  7. luogu P1962 斐波那契数列
  8. Python - 浅谈Python的编译与反编译
  9. 多分支维护难题:如何提交 ChangeLog 变更日志?
  10. 主机前置耳机孔没声音
  11. 学会数据可视化,轻松做出企业级可视化报表
  12. 基于51单片机+SYN6288语音播报
  13. 对Bat文件进行加密
  14. Vue双向绑定失效 v-model
  15. 【人工智能】—局部搜索算法、爬山法、模拟退火、局部剪枝、遗传算法
  16. 你必须懂!也可以懂的@Transactional原理!
  17. Ant编译Java项目-QuickStart
  18. 4411 三仙归洞(找规律-周期)
  19. 漏洞介绍及修复建议(漏洞汇总,建议收藏后期会不断更新)
  20. dhu 数据科学与技术 第2次作业

热门文章

  1. 「daza.io」这将是我独立完成全端开发的项目
  2. Jquery基础之DOM操作
  3. 如何发布打印机文件夹及ICA 客户端打印机配置工具
  4. Facade模式——设计模式学习笔记
  5. 统计学习方法|支持向量机(SVM)原理剖析及实现
  6. windows mobile 软件_三星两款新软件曝光,使智能手机和电视更好交互
  7. Calendar日历简单用法
  8. Quartz.net持久化与集群部署开发详解
  9. linux 下 用户与用户组
  10. 关于Node.js中安装完express后不能使用express命令