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

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

二、约定

占一个字节,代码如下:

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

三、功能说明:

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 = ;
private static long blockCount;
private static int size = ;
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 - ) / size + ; 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, , bArr.Length);
}
}
#endregion /// <summary>
/// 接收串口数据事件
/// </summary>
public void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (serialPort.BytesToRead == ) return; int bt = serialPort.ReadByte(); switch (bt)
{
case (int)Protocol.Server端本次接收完毕:
if (index != blockCount - )
{
byte[] bArr = new byte[size + ];
bArr[] = (int)Protocol.Client端发送数据块;
fs.Read(bArr, , size);
index++;
Thread.Sleep();
serialPort.Write(bArr, , bArr.Length);
}
else
{
byte[] bArr = new byte[fs.Length - (size * index) + ];
bArr[] = (int)Protocol.Client端发送最后一个数据块;
fs.Read(bArr, , bArr.Length - );
index++;
serialPort.Write(bArr, , bArr.Length);
}
break;
case (int)Protocol.Server端结束:
index = ;
double totalSeconds = DateTime.Now.Subtract(dt).TotalSeconds;
MessageBox.Show("完成,耗时" + totalSeconds + "秒,速度" + (fs.Length / 1024.0 / totalSeconds).ToString("#.0") + "KB/S");
fs.Close();
fs.Dispose();
break;
}
} }
}

五、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 == ) return; #region 接收数据
int bt = serialPort.ReadByte();
List<byte> bList = new List<byte>();
while (serialPort.BytesToRead > )
{
byte[] bArr = new byte[serialPort.BytesToRead];
serialPort.Read(bArr, , 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[];
bArr[] = (int)Protocol.Server端本次接收完毕;
serialPort.Write(bArr, , bArr.Length);
break;
case (int)Protocol.Client端发送数据块:
fs.Write(receiveData, , receiveData.Length);
fs.Flush();
bArr = new byte[];
bArr[] = (int)Protocol.Server端本次接收完毕;
serialPort.Write(bArr, , bArr.Length);
break;
case (int)Protocol.Client端发送最后一个数据块:
fs.Write(receiveData, , receiveData.Length);
fs.Flush();
bArr = new byte[];
bArr[] = (int)Protocol.Server端结束;
serialPort.Write(bArr, , bArr.Length);
fs.Close();
fs.Dispose();
break;
}
} }
}

C#串口通信—传输文件测试的更多相关文章

  1. java socket通信-传输文件图片--传输图片

    ClientTcpSend.java   client发送类 package com.yjf.test; import java.io.DataOutputStream; import java.io ...

  2. 98.TCP通信传输文件

    客户端 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include <stdlib.h> #include <s ...

  3. C# 开发Modbus Rtu客户端 modbus测试Demo,Modbus 串口通信 , 虚拟MODBUS-RTU测试

    前言 本文将使用一个NuGet公开的组件技术来实现一个ModBus RTU的客户端,方便的对Modbus rtu的服务器进行读写,这个服务器可以是电脑端C#设计的,也可以是PLC实现的,也可以是其他任 ...

  4. Java Socket实战之七 使用Socket通信传输文件

    http://blog.csdn.net/kongxx/article/details/7319410 package com.googlecode.garbagecan.test.socket.ni ...

  5. (三)stm32之串口通信DMA传输完成中断

    一.DMA功能简介 首先唠叨一下DMA的基本概念,DMA的出现大大减轻了CPU的工作量.在硬件系统中,主要由CPU(内核).外设.内存(SRAM).总线等结构组成,数据经常要在内存和外设之间,外设和外 ...

  6. ARM 开发板嵌入式linux系统与主机PC通过串口传输文件

    本文转载自http://useless20.blog.163.com/blog/static/237409982010227127576/ 嵌入式linux系统与主机通过串口传输文件 我想如果要从PC ...

  7. 串口传输文件 lrzsz

    假设有一种开发环境,一块板子,除了串口,没有任何外部出入输出设备,没有sd卡,没有网线,这个时候如果你想跟这块板子传输交互文件,要怎么办? 根据modem所采用的文件传输协议:xmodem,ymode ...

  8. 使用sz/rz基于串口传输文件

    关键词:lrzsz.minicom.ZMODEM.MD5sum等. 在环境受限的嵌入式系统上,往往只有串口可以使用. 此时如果需要传输文件,需要借助rz/sz工具,可以使用的传输协议有ZMODEM.Y ...

  9. 如何使用飞秋FeiQ实现两电脑通信(或传输文件)

    如何使用飞秋FeiQ实现两电脑通信(或传输文件) 1. 在两天电脑上,分别按照飞秋FeiQ 我使用的绿色飞秋2013正式版 2. 使用一根网线,将两电脑的网口连接一起 3. 设置飞秋FeiQ的端口号不 ...

随机推荐

  1. Flume采集处理日志文件

    Flume简介 Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集.聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据:同时,Flume提供对数据 ...

  2. SQL 行列倒置

    SQL的的行列倒置已经不是新知识了,但在博主的技术咨询期间,仍发现其实有很多人并不了解这块,所以在此专门写一篇博客记录.本文将以Mysql为例,并以数据采集指标信息获取为例子.在下面的例子,你可以在s ...

  3. 巧用JS内置对象Function

    在做练习的时候也好,做项目的时候也好,我经常会碰到想要的到一个字符串“”里面的东西的这样的需求. 注意,“”里面的东西可以是任何东西[],number等等 于是有了个大神教我一个绝招: 于是世界圆满了 ...

  4. 一天一小段js代码(no.4)

    最近在看网上的前端笔试题,借鉴别人的自己来试一下: 题目: 写一段脚本,实现:当页面上任意一个链接被点击的时候,alert出这个链接在页面上的顺序号,如第一个链接则alert(1), 依次类推. 有一 ...

  5. Java序列化格式详解

    RPC的世界,由于涉及到进程间网络远程通信,不可避免的需要将信息序列化后在网络间传送,序列化有两大流派: 文本和二进制. 文本序列化 序列化的实现有很多方式,在异构系统中最常用的就是定义成人类可读的文 ...

  6. 关于Java中null的十点详解

    对于每一个Java程序员来说,null肯定是一个让人头痛的东西,连Java的发明者都承认这是一项巨大的设计失误,今天就来总结一下Java中关于null的知识. 1.null不属于任何类型,可以被转换成 ...

  7. 缓存篇~第七回 Redis实现基于方法签名的数据集缓存(可控更新,分布式数据缓存)

    返回目录 本篇文章可以说是第六回 Microsoft.Practices.EnterpriseLibrary.Caching实现基于方法签名的数据集缓存(可控更新,WEB端数据缓存)的续篇,事实上,有 ...

  8. Atitit 代理CGLIB 动态代理 AspectJ静态代理区别

    Atitit 代理CGLIB 动态代理 AspectJ静态代理区别 1.1. AOP 代理主要分为静态代理和动态代理两大类,静态代理以 AspectJ 为代表:而动态代理则以 spring AOP 为 ...

  9. fir.im Weekly - 这是一份强大的 SwiftGuide

    大新闻!Apple 10 亿美元融资滴滴!库克大叔对中国 iOS 开发者表达了高度认可,同时也传出 iOS 10 将内置滴滴 App 的消息.想像下,某个加班的深夜飙完代码,最性感的事情莫过于:「Si ...

  10. salesforce 零基础学习(二十三)数据记录导出至excel(自定义报表导出)

    我们都知道,报表有个功能为导出excel,但是有的时候客户需求往往标准的报表达不到,比如导出excel,其中本月修改的数据字段标红,如下图所示. 这就需要我们去写VF来实现此功能. 需求:将数据表记录 ...