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

一、使用虚拟串口工具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. 每周一书-《Bootstrap基础教程》

    首先说明,本周活动有效时间为8月15日到21日.本周为大家送出的书是有电子工业出版,贺臣/陈鹏编著的<Bootsrap基础教程>,为前端入门必读书籍. 下面是从书中摘录的内容. “ Boo ...

  2. Wix 安装部署教程(十三) -- 多语言安装包

    这几天摸索WIX的多语言安装包(这里是Wix的setup 工程,不是Bundle),终于走通了,感谢网友uni的指点.WIX的多语言安装包能够根据系统环境自动切换界面语言,你也可以通过命令指定语言.下 ...

  3. sublime 2/3 for mac link to command

    Sublime command for mac : execute those command: subl 2: sudo ln -s /Applications/Sublime\ Text\ 2.a ...

  4. Json序列化之.NET开源类库Newtonsoft.Json的研究

     一.Json简介 JSON(全称为JavaScript Object Notation) 是一种轻量级的数据交换格式.它是基于JavaScript语法标准的一个子集. JSON采用完全独立于语言的文 ...

  5. jQuery实现返回顶部

    由于项目需要,写了个返回顶部的小功能... /*返回顶部*/ function toTop() { $(".to_top").hide(); $(window).scroll(fu ...

  6. [FPGA] 2、新建并运行一个工程

    上一篇将开发板的情况大致介绍了一下,这次将一步一步展示如何新建.调试并下载运行一个点亮LED的工程. 1)打开Quartus新建工程: 2)填写规则大致如下: 3)选择我们芯片的类型: 4)点击fil ...

  7. windows批处理总结

    rem echo off 表示之后所有命令行不显示,但命令结果总是会显示的!! 不存在%ROOT_DIR% . %CUR_DIR%的变量 rem @表示命令行不显示当前行,但命令结果总是会显示的!! ...

  8. IBatisNet:让insert操作返回新增记录的主键值

    项目引用ibatis包: IBatisNet.Common.dll --文件版本1.6.2.0 IBatisNet.DataAccess.dll IBatisNet.DataMapper.dll 项目 ...

  9. Linux应用总结(1):自动删除n天前日志

    linux是一个很能自动产生文件的系统,日志.邮件.备份等.虽然现在硬盘廉价,我们可以有很多硬盘空间供这些文件浪费,让系统定时清理一些不需要的文件很有一种爽快的事情.不用你去每天惦记着是否需要清理日志 ...

  10. Redis操作命令总结

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/118.html?1455860089 一.key pattern 查询相应 ...