代码是项目中拷出来的,俗称刷机软件,绝对可用,缺少的控件和变量名自己补齐就好

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.1 串口中断问题 单字节中断, DMA 空闲中断, 发送不连续.处理不及时 1.2 丢包, 断包, 粘包 ...

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

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

  3. 野火串口助手协议发送文件通讯协议——XMODEM协议——YMODEM协议

    野火串口助手协议发送文件通讯协议 修订历史 日期 版本 更新内容 2020/6/22 0.0.1 首次发布 XMODEM协议 上位机是现实了XModem-CRC16和XModem-1K; XModem ...

  4. 安装Xshell并使用其进行Ymodem协议的串口传输

    文章目录 引言 介绍 Xshell Ymodem协议 Xshell免费版安装下载 下载 安装Xshell 通过Xshell使用Ymodem传输文件 后续 引言 我们在嵌入式开发中,往往会进行各种各样的 ...

  5. HC32L130基于Xmodem协议实现IAP串口在线升级

    在开始写文章之前,要先吐槽一下国产单片机,不对是国产单片机厂家,他们的技术支持实在太烂了,烂的让你怀疑等技术支持还不如自己啃手册,尤其是那种中间有代理商的厂家,技术支持更是良莠不齐,时效性也不行,问个 ...

  6. c#使用Xmodem协议传输

    需求:前一段时间朋友想要上位机向板卡传输升级文件,做到自动升级板卡程序,上位机使用c#编写,下位机使用c语言编写,可执行程序采用Xmodem协议传输,在网上浏览了很久没有找到好的c#版本的Xmodem ...

  7. 通俗易懂Xmodem协议

    在工作中写Bootloader时,需要串口传输代码数据,为了保证传输数据时不丢帧,需要用到通信协议,我选择的是Xmodem协议. 文章目录 1. 定义 2. 控制字符 3. 帧数据格式 4. 数据包说 ...

  8. linux串口传文件除了rz,使用sz/rz基于串口传输文件

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

  9. Xmodem 协议介绍及应用(基于 ESP-IDF)

    Xmodem 协议介绍及应用(基于 ESP-IDF) 目录 1. 介绍 2. 目的 3. 硬件准备 4. 环境搭建 5. SDK 准备 6. 功能介绍 7. 编译&烧写&运行 1. 介 ...

最新文章

  1. 闲着无聊,自己写了个几个string.h里的函数练手
  2. ORACLE11G RAC增加节点操作
  3. t3修改计算机后就无法登录了,电脑更换系统后,用友T3登录不上了,一直显示这个,怎么处理,这个怎么解决...
  4. UserWarning: The default mode, 'constant', will be changed to 'reflect'
  5. 关于MySQL优化的几个问题
  6. zookeeper安装和使用
  7. 最大子序和--动态规划
  8. VMware esxi在线增加Linux LVM硬盘不需重新启动
  9. 宝塔linux架设手游,守望黎明架-linux手工端设教程
  10. WIN7运行命令大全
  11. 禁止 Windows 10 和 Windows Server 自动更新
  12. WTL 自绘控件库 (CQsAnimaStatic)
  13. 印象笔记Android怎样创建md,LocalNote,让你像使用本地文件一样使用印象笔记(支持 markdown 格式)...
  14. 学习ESP8266_15_Flash
  15. EDG夺冠引全网欢呼,电竞时代要来了吗?
  16. 介绍一些新手入门FPGA的优秀网站(新增4)
  17. 尚书视频群活动:投资分析师笔试题
  18. php自定义函数全局声明,thinkphp3.2自定义函数全局功能函数,模板自定义函数
  19. 1198:逆波兰表达式(递归,前缀表达式,波兰表达式)
  20. java th标签_初步认识Thymeleaf:简单表达式和标签。(一)

热门文章

  1. 使用Qt构建ROS应用程序
  2. ios 旋转屏幕试图切换_iOS屏幕旋转及其基本适配方法
  3. linux maven 发布项目,Linux下基于Maven的自动化打包发布项目
  4. Easyrecovery教您如何一招恢复手机误删照片!
  5. 【示波器专题】示波器的频响方式
  6. 误删除系统libselinux.so.1之后
  7. 【翻译】乔尔测试:改进代码的12步
  8. 10G Ethernet PCS/PMA IP 核
  9. 分布式系统实践学习总结
  10. oraclenbsp;命名规范