c#用串口传输二进制文件 xmodem协议
代码是项目中拷出来的,俗称刷机软件,绝对可用,缺少的控件和变量名自己补齐就好
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.IO.Ports;
using System.Linq;
using System.Net; //引入socket命名
using System.Net.Sockets;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.VisualBasic;
1、第一步,打开二进制文件并存为list
OpenFileDialog openFileDialog1 = new OpenFileDialog(); //定义打开文本位置的类
openFileDialog1.Filter = "Bin Files (.bin)|*.bin|所有文件 (*.*)|*.*";//文件筛选器的设定
openFileDialog1.FilterIndex = 1;
openFileDialog1.FileName = "";
openFileDialog1.ShowReadOnly = true;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
tbx_FileName.Text = openFileDialog1.FileName;
try
{
Open_File_list.Clear();
FileStream fs = new FileStream(openFileDialog1.FileName, FileMode.Open);//初始化文件流
BinaryReader sr = new BinaryReader(fs);
sr.BaseStream.Seek(0, SeekOrigin.Begin);
Open_File_array_length = (int)fs.Length;
for (int i = 0; i < Open_File_array_length; i++)
{
byte tmp = sr.ReadByte();
Open_File_list.Add(tmp);
}
//关闭此StreamReader对象
sr.Close();
fs.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return;
}
}
2、第二步创建一个线程发送list,用到xmodem协议
private void sendFile()
{
ComThread_Run_Flag = false;
btn_SendFile.Enabled = false;
Timer1_Run_Flag = true;
rcv_buffer = new byte[255]; //创建数字缓存区
send_buffer = new byte[1029]; //创建缓存区 1024 for XModem 1k + 3 head chars + 2 crc
packetno = 1;
complate_sz = 0; //已经发送的字节数
totle_sz = 0; //需要发送数据包的长度
remnant_sz = 0; //剩余长度
complate = false; //发送完成标志位
done = true; //串口发送文件结束的标记
//string return_data = ""; //返回值
Send_Times = 0; //重发次数
while (done)
{
Thread.Sleep(10);
Per_Sec_Count++;
if (Per_Sec_Count > MAX_WAIT_C_SEC * 500)
{
done = false;
Per_Sec_Count = 0;
btn_SendFile.Enabled = true;
ComThread_Run_Flag = true;
//Timer1_Run_Flag = false;
toolStripProgressBar1.Value = 0;//设置当前值
MessageBox.Show("接收超时", "发送文件", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
int rcv_DataLen = serialPort1.BytesToRead; //接收的字节数
if (rcv_DataLen > 0)
{
serialPort1.Read(rcv_buffer, 0, rcv_DataLen);//把数据读入缓存区
//Console.WriteLine("rcv_buffer0:{0}", rcv_buffer[0].ToString("X2") + " ");
//AddContent(rcv_buffer[0].ToString("X2")+"\n", "Green");
// Console.WriteLine("totle_sz:{0} complate_sz:{1} remnant_sz{2}", totle_sz, complate_sz, remnant_sz);
AddContent("<"+DateTime.Now.ToString ("HH:mm:ss")+">" +"已完成:"+complate_sz+"/"+totle_sz+"\n" ,"Green");
//this.AddData(rcv_buffer, rcv_DataLen);//输出显示数据
// BarCountRx.Text = Convert.ToString(Convert.ToInt32(BarCountRx.Text) + rcv_DataLen); //接收字节计数
rcv_DataLen += rcv_buffer.Length;
BarCountRx.Text = Convert.ToString(rcv_DataLen); //接收字节计数
if (rcv_buffer[0] == POLL)
{
Per_Sec_Count = 0;
totle_sz = Open_File_array_length;
packetno = 1;
complate_sz = 0;
Send_Times = 0;
toolStripProgressBar1.Maximum = (int)totle_sz;
toolStripProgressBar1.Value = 0;//设置当前值
goto send_data;
}
else if (rcv_buffer[0] == ACK)
{
Per_Sec_Count = 0;
complate_sz = complate_sz + remnant_sz;
toolStripProgressBar1.Value = complate_sz;
toolStripStatusLabel3.Text = (Convert.ToDouble(complate_sz) / Convert.ToDouble(totle_sz)*100).ToString().Substring(0,2) + "%";
if (complate_sz < totle_sz)
{
Send_Times = 0;
packetno++;
goto send_data;
}
else
{
if (complate == true)
{
done = false;
Per_Sec_Count = 0;
btn_SendFile.Enabled = true;
ComThread_Run_Flag = true;
//Timer1_Run_Flag = false;
toolStripProgressBar1.Value = 0;//设置当前值
MessageBox.Show("发送完成", "发送文件", MessageBoxButtons.OK, MessageBoxIcon.Information);
flag_time = true;
beforDT = System.DateTime.Now;
return;
}
else
{
goto send_data;
}
}
}
else if (rcv_buffer[0] == NAK)
{
Per_Sec_Count = 0;
goto send_data;
}
else if (rcv_buffer[0] == CAN)
{
done = false;
Per_Sec_Count = 0;
btn_SendFile.Enabled = true;
ComThread_Run_Flag = true;
//Timer1_Run_Flag = false;
toolStripProgressBar1.Value = 0;//设置当前值
MessageBox.Show("强制结束", "发送文件", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
else
{
done = false;
Per_Sec_Count = 0;
btn_SendFile.Enabled = true;
ComThread_Run_Flag = true;
//Timer1_Run_Flag = false;
toolStripProgressBar1.Value = 0;//设置当前值
MessageBox.Show("发送错误", "发送文件", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
send_data:
try
{
if (Send_Times < MAX_RSEND)
{
send_buffer[0] = STX;
send_buffer[1] = packetno;
send_buffer[2] = (byte)(~packetno);
remnant_sz = totle_sz - complate_sz;
if (remnant_sz > Per_Pack_Sz)
{
remnant_sz = Per_Pack_Sz;
}
if (remnant_sz > 0)
{
//Array.Copy(Open_File_array, complate_sz, send_buffer, 3, remnant_sz);
Open_File_list.CopyTo(complate_sz, send_buffer, 3, remnant_sz);
if (remnant_sz < Per_Pack_Sz) //数据不足一包完整的数据包
{
for (int i = 3 + remnant_sz; i < Per_Pack_Sz + 3; i++)
{
send_buffer[i] = CTRLZ;
}
}
int CRC = u16CRCVerify(send_buffer, 3, Per_Pack_Sz);
send_buffer[Per_Pack_Sz + 3] = (byte)((CRC >> 8) & 0xFF);
send_buffer[Per_Pack_Sz + 4] = (byte)((CRC) & 0xFF);
for (int j = 0; j < Per_Pack_Sz + 5; j++)
{
Console.Write(send_buffer[j].ToString("X2") + " ");
}
Console.WriteLine("");
this.serialPort1.Write(send_buffer, 0, Per_Pack_Sz + 5);
Send_Times++;
}
else
{
byte[] buffer2 = new byte[1];
buffer2[0] = EOT;
for (int j = 0; j < 1; j++)
{
Console.Write(buffer2[j].ToString("X2") + " ");
}
Console.WriteLine("");
this.serialPort1.Write(buffer2, 0, 1);
complate = true;
}
}
else
{
done = false;
Send_Times = 0;
Per_Sec_Count = 0;
btn_SendFile.Enabled = true;
ComThread_Run_Flag = true;
//Timer1_Run_Flag = false;
toolStripProgressBar1.Value = 0;//设置当前值
MessageBox.Show("发送错误", "发送文件", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return;
}
}
}
}
c#用串口传输二进制文件 xmodem协议相关推荐
- 串口传输链路层协议的妙用
1 背景 在调试项目时发现, 发现仅仅串口传输, 就会遇到多种问题, 层出不穷,故整理如下 1.1 串口中断问题 单字节中断, DMA 空闲中断, 发送不连续.处理不及时 1.2 丢包, 断包, 粘包 ...
- xmodem java_Xmodem XMODEM协议是一种串口通信中广泛用到的异步文件传输协议 联合开发网 - pudn.com...
Xmodem 所属分类:串口编程 开发工具:Java 文件大小:3KB 下载次数:6 上传日期:2017-11-02 21:50:52 上 传 者:雄霸天下19 说明: XMODEM协议是一种串口通 ...
- 野火串口助手协议发送文件通讯协议——XMODEM协议——YMODEM协议
野火串口助手协议发送文件通讯协议 修订历史 日期 版本 更新内容 2020/6/22 0.0.1 首次发布 XMODEM协议 上位机是现实了XModem-CRC16和XModem-1K; XModem ...
- 安装Xshell并使用其进行Ymodem协议的串口传输
文章目录 引言 介绍 Xshell Ymodem协议 Xshell免费版安装下载 下载 安装Xshell 通过Xshell使用Ymodem传输文件 后续 引言 我们在嵌入式开发中,往往会进行各种各样的 ...
- HC32L130基于Xmodem协议实现IAP串口在线升级
在开始写文章之前,要先吐槽一下国产单片机,不对是国产单片机厂家,他们的技术支持实在太烂了,烂的让你怀疑等技术支持还不如自己啃手册,尤其是那种中间有代理商的厂家,技术支持更是良莠不齐,时效性也不行,问个 ...
- c#使用Xmodem协议传输
需求:前一段时间朋友想要上位机向板卡传输升级文件,做到自动升级板卡程序,上位机使用c#编写,下位机使用c语言编写,可执行程序采用Xmodem协议传输,在网上浏览了很久没有找到好的c#版本的Xmodem ...
- 通俗易懂Xmodem协议
在工作中写Bootloader时,需要串口传输代码数据,为了保证传输数据时不丢帧,需要用到通信协议,我选择的是Xmodem协议. 文章目录 1. 定义 2. 控制字符 3. 帧数据格式 4. 数据包说 ...
- linux串口传文件除了rz,使用sz/rz基于串口传输文件
关键词:lrzsz.minicom.ZMODEM.MD5sum等. 在环境受限的嵌入式系统上,往往只有串口可以使用. 此时如果需要传输文件,需要借助rz/sz工具,可以使用的传输协议有ZMODEM.Y ...
- Xmodem 协议介绍及应用(基于 ESP-IDF)
Xmodem 协议介绍及应用(基于 ESP-IDF) 目录 1. 介绍 2. 目的 3. 硬件准备 4. 环境搭建 5. SDK 准备 6. 功能介绍 7. 编译&烧写&运行 1. 介 ...
最新文章
- 闲着无聊,自己写了个几个string.h里的函数练手
- ORACLE11G RAC增加节点操作
- t3修改计算机后就无法登录了,电脑更换系统后,用友T3登录不上了,一直显示这个,怎么处理,这个怎么解决...
- UserWarning: The default mode, 'constant', will be changed to 'reflect'
- 关于MySQL优化的几个问题
- zookeeper安装和使用
- 最大子序和--动态规划
- VMware esxi在线增加Linux LVM硬盘不需重新启动
- 宝塔linux架设手游,守望黎明架-linux手工端设教程
- WIN7运行命令大全
- 禁止 Windows 10 和 Windows Server 自动更新
- WTL 自绘控件库 (CQsAnimaStatic)
- 印象笔记Android怎样创建md,LocalNote,让你像使用本地文件一样使用印象笔记(支持 markdown 格式)...
- 学习ESP8266_15_Flash
- EDG夺冠引全网欢呼,电竞时代要来了吗?
- 介绍一些新手入门FPGA的优秀网站(新增4)
- 尚书视频群活动:投资分析师笔试题
- php自定义函数全局声明,thinkphp3.2自定义函数全局功能函数,模板自定义函数
- 1198:逆波兰表达式(递归,前缀表达式,波兰表达式)
- java th标签_初步认识Thymeleaf:简单表达式和标签。(一)