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

一、使用虚拟串口工具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. 像素图的实时光照 Lighting on Pixel Art

    去年有这样一个工具,We got one toolkit last year. 他有什么功能呢?What is its function? 让你画出各个方向的照明图 That you can draw ...

  2. vpn establish capability from a remote deskstop is disabled错误的解决办法

    使用Cisco的VPN时,有时候会提示vpn establish capability from a remote deskstop is disabled.这样的错误,解决办法就是重启本机的Remo ...

  3. 手把手教你用python打造网易公开课视频下载软件2-编码相关说明

    函数getdownLoadInfo(url)主要实现核心功能:根据url地址,获取课程信息:课程名(courseTitle),课程数目(courseCount),可下载视频数目(videoCount) ...

  4. GLFW初体验

    GLFW - 很遗憾,没有找到FW的确切含义,Wiki上没有,GLFW主页也没有.猜测F表示for,W表示Window GLFW是干啥用的? 一个轻量级的,开源的,跨平台的library.支持Open ...

  5. 让C#轻松实现读写锁分离--封装ReaderWriterLockSlim

    ReaderWriterLockSlim 类 表示用于管理资源访问的锁定状态,可实现多线程读取或进行独占式写入访问. 使用 ReaderWriterLockSlim 来保护由多个线程读取但每次只采用一 ...

  6. React Native02-开始运行 Android篇

    1. 开始运行 1)用命令进入到新建的文件目录下,比如HelloWorld,再输入 react-native start: 在等待一段时间后,我们看到最后面有个地址,说明已经运行成功了. 我们输入地址 ...

  7. Atitit 发帖机系列(7) 词法分析的方法attilax大总结)

    Atitit 发帖机系列(7) 词法分析的方法attilax大总结) 1.1. 词法分析貌似俩大方法,一个直接根据状态图转换,一个根据dfa1 1.2. switchcase或者ifelse 最原始方 ...

  8. Atitit 常用比较复杂的图像滤镜 attilax大总结

    Atitit 常用比较复杂的图像滤镜 attilax大总结 像素画滤镜 水彩油画滤镜 素描滤镜 梦幻镜 特点是中央集焦,周围景物朦化微带光晕,使人产生如入梦境的感觉.常用于拍摄婚纱.明星照,也用于其它 ...

  9. SlickUpload Quick Start Guide

    Quick Start Guide The SlickUpload quick start demonstrates how to install SlickUpload in a new or ex ...

  10. KnockoutJS 3.X API 第四章 数据绑定(3) 控制流if绑定和ifnot绑定

    if绑定目的 if绑定一般是格式是data-bind=if:attribute,if后所跟属性或表达式的值应为bool值(也可以是非bool值,当非空字符串时则为真),if绑定的作用与visible绑 ...