前言:
由于项目原因,要实施的客户离作者太远,考虑提供软件的在线升级功能.我们如何实现呢!先讲下思路.

思路:
先实现WEB端的开发,主要考虑使用WEBService技术,提供远程服务的调用函数,返回一个文件的字节内容,然后写一个升级程序客户端,分发给客户使用的机器中,(可以随客户的软件一起安装).该客户端程序主要连接webserivce,然后将文件保存到本地机(客户的机器)中.就可以实现!

实现的细节:
要考虑提供给客户软件版本问题,低版本的升级,最新版本的就不用升级.还要考虑用户名与密码在WEB端的认证!

使用技术:
ASP.Net WebService开发,客户端的异步调用WebService方法.数据库技术!

如果转载请说明出处,http://blog.csdn.Net/zerodj
作者主页:http://itbaby.jss.cn
注意:itbaby.jss.cn中,技术文章不再更新,全部转到blog.csdn.Net/zerodj中.

开始实现:

1.建立数据库,作者(itbaby)使用SQLSERVER2000
1)软件项目表:softlist(softid, softname, resume, loginname, loginpwd)
softid:编号
softname:软件名称
resume:介绍
loginname:客户登录名
loginpwd:密码

2)各个软件的版本表 SoftListVersion(softid, subid, version, UpdatePath, olefile)
softid:主表的软件编号
subid:各版本数据编号
version:软件版本
filename:升级文件名
olefile:升级文件的二进制内容,是image类型,(我主要存放MSI的安装包文件类型,可以使用C#做此类安装包文件)

3)建立一个视图,chkVersion,用于检查版本号
SELECT dbo.SoftListVersion.subid, dbo.softlist.softname, dbo.SoftListVersion.version
FROM dbo.softlist INNER JOIN
        dbo.SoftListVersion ON dbo.softlist.softid = dbo.SoftListVersion.softid

4)再建立一个视图,vOleFile,用于下载文件
SELECT dbo.SoftListVersion.subid, dbo.softlist.softname, dbo.SoftListVersion.filename,
        dbo.SoftListVersion.olefile, dbo.SoftListVersion.version
FROM dbo.softlist INNER JOIN
        dbo.SoftListVersion ON dbo.softlist.softid = dbo.SoftListVersion.softid

2.写一个WEBSERVICE
1)启动VS.Net2003,建立一个叫babyWebSvc的项目,项目类型为(ASP.Net WEB服务)
2)添加一个SoftUpdate.asmx的WEB服务

3)添加一个方法SearchVersion

view plaincopy to clipboardprint?
[WebMethod(Description="返回当前软件升级包的最高版本")]  
public string SearchVersion(string softname)  
{  
   string sVersion = "";  
   webmod.dbConnStart(); //(连接)作者自己的连接数据库类,用户自己完成数据库连接  
   string strSQL = "select MAX(version) as MaxVerID from chkVersion where softname = @softname";  
   SqlCommand sqlCmd = new SqlCommand(strSQL,webmod.sqlConn);  
   sqlCmd.CommandTimeout = 0;  
   sqlCmd.Parameters.Add("@softname",SqlDbType.VarChar).Value = softname;  
   SqlDataReader sqlRd = sqlCmd.ExecuteReader();  
   if(sqlRd.HasRows)  
   {  
    sqlRd.Read();  
    sVersion = Convert.ToString(sqlRd["MaxVerID"]);  
   }  
   sqlRd.Close();  
     
   webmod.dbConnEnd(); //(断开连接)作者自己的连接数据库类,用户自己完成数据库连接  
 
   return sVersion;  

[WebMethod(Description="返回当前软件升级包的最高版本")]
public string SearchVersion(string softname)
{
   string sVersion = "";
   webmod.dbConnStart(); //(连接)作者自己的连接数据库类,用户自己完成数据库连接
   string strSQL = "select MAX(version) as MaxVerID from chkVersion where softname = @softname";
   SqlCommand sqlCmd = new SqlCommand(strSQL,webmod.sqlConn);
   sqlCmd.CommandTimeout = 0;
   sqlCmd.Parameters.Add("@softname",SqlDbType.VarChar).Value = softname;
   SqlDataReader sqlRd = sqlCmd.ExecuteReader();
   if(sqlRd.HasRows)
   {
    sqlRd.Read();
    sVersion = Convert.ToString(sqlRd["MaxVerID"]);
   }
   sqlRd.Close();
  
   webmod.dbConnEnd(); //(断开连接)作者自己的连接数据库类,用户自己完成数据库连接

return sVersion;
}

4)添加下载文件内容的方法DownloadSoft

view plaincopy to clipboardprint?
[WebMethod(Description="返回需要下载的文件字节")]  
public byte[] DownloadSoft(string UserName,string PassWord,string SoftDnldName,string SoftHeightVersion)  
{  
   //(连接)作者自己的连接数据库类,用户自己完成数据库连接  
   webmod.dbConnStart();  
 
   //检查用户合法性  
   bool bMember = CheckAuth(UserName,PassWord);//该WebService内的一个检查用户合法性的函数,用户可以自己完成  
   if(!bMember)  
   {  
    webmod.dbConnEnd();  
    return null;  
   }  
 
   byte[] b = null;  
 
   //我们取出指定软件名称的最高版本的升级包  
   string strSQL = "select olefile from vOleFile where (filename=@softname) and version=@ver";  
   SqlCommand sqlCmd = new SqlCommand(strSQL,webmod.sqlConn);  
   sqlCmd.CommandTimeout = 0;  
   sqlCmd.Parameters.Add("@softname",SqlDbType.VarChar).Value = SoftDnldName;  
   sqlCmd.Parameters.Add("@ver",     SqlDbType.VarChar).Value = SoftHeightVersion;  
   SqlDataReader sqlRd = sqlCmd.ExecuteReader();  
   if(sqlRd.HasRows)  
   {  
    sqlRd.Read();  
    b = (byte[])sqlRd["olefile"];//文件的字节内容  
   }  
   sqlRd.Close();  
 
   //(断开连接)作者自己的连接数据库类,用户自己完成数据库连接  
   webmod.dbConnEnd();  
 
   return b;  

[WebMethod(Description="返回需要下载的文件字节")]
public byte[] DownloadSoft(string UserName,string PassWord,string SoftDnldName,string SoftHeightVersion)
{
   //(连接)作者自己的连接数据库类,用户自己完成数据库连接
   webmod.dbConnStart();

//检查用户合法性
   bool bMember = CheckAuth(UserName,PassWord);//该WebService内的一个检查用户合法性的函数,用户可以自己完成
   if(!bMember)
   {
    webmod.dbConnEnd();
    return null;
   }

byte[] b = null;

//我们取出指定软件名称的最高版本的升级包
   string strSQL = "select olefile from vOleFile where (filename=@softname) and version=@ver";
   SqlCommand sqlCmd = new SqlCommand(strSQL,webmod.sqlConn);
   sqlCmd.CommandTimeout = 0;
   sqlCmd.Parameters.Add("@softname",SqlDbType.VarChar).Value = SoftDnldName;
   sqlCmd.Parameters.Add("@ver",     SqlDbType.VarChar).Value = SoftHeightVersion;
   SqlDataReader sqlRd = sqlCmd.ExecuteReader();
   if(sqlRd.HasRows)
   {
    sqlRd.Read();
    b = (byte[])sqlRd["olefile"];//文件的字节内容
   }
   sqlRd.Close();

//(断开连接)作者自己的连接数据库类,用户自己完成数据库连接
   webmod.dbConnEnd();

return b;
}

3.WEB服务的方法完成后,你自己可以启动,测试,我们现在来写客户端的升级程序,假定你在开发时的WEBSERVICE的URL为:http://localhost/babywebsvc/SoftUpdate.asmx,注意这个URL,我们是要在客户端引用的
4.启动VS.Net2003,建立一个C#的Windows项目,在默认的FORM上添加一个按钮,
5.添加一个新的文件类型(应用程序配置文件)App.config
App.Config文件的内容

view plaincopy to clipboardprint?
<?Xml version="1.0" encoding="utf-8"?>  
<configuration>  
   <appSettings>  
    <add key="user" value="test"/>  
    <add key="pwd" value="test"/>  
    <add key="babyRecordSoftName" value="TEST.EXE"/><!--记录在远程的数据库中的软件名称-->  
    <add key="Version" value="1.0"/>  
   </appSettings>  
</configuration> 
<?Xml version="1.0" encoding="utf-8"?>
<configuration>
   <appSettings>
    <add key="user" value="test"/>
    <add key="pwd" value="test"/>
    <add key="babyRecordSoftName" value="TEST.EXE"/><!--记录在远程的数据库中的软件名称-->
    <add key="Version" value="1.0"/>
   </appSettings>
</configuration>

6.我们在Form启动的LOAD事件中,添加如下代码

view plaincopy to clipboardprint?
private void Form1_Load(object sender, System.EventArgs e)  
{  
//读出版本号,该版本号是在AssemblyInfo.cs中由系统本身设置的,[assembly: AssemblyVersion("1.0")]  
//以后要更改,可以改此处的AssemblyInfo.cs中的版本号,例:[assembly: AssemblyVersion("1.1")]  
//我们的WEBSERVICE中需要这个数据做为参数  
 
string sVersion = Application.ProductVersion;  
 
 
//写到App.Cofing文件中,每次调用WEBSERVICE方法时,从App.Cofing中读取版本,你也可以直接使用Application.ProductVersion,我是为了统一管理,全部从config中读取  
this.SaveAppConfig("Version",sVersion);  
}  
 
 
//SaveAppConfig函数的内容  
public static void SaveAppConfig(string AppKey,string AppValue)  
{  
   XmlDocument xDoc = new XmlDocument();  
   xDoc.Load(Application.ExecutablePath + ".config");  
 
   XmlNode xNode;  
   XmlElement xElem1;  
   XmlElement xElem2;  
 
 
   xNode = xDoc.SelectSingleNode("//appSettings");  
 
   xElem1 = (XmlElement)xNode.SelectSingleNode("//add[@key='" + AppKey + "']");  
   if ( xElem1 != null ) xElem1.SetAttribute("value",AppValue);  
   else 
   {  
    xElem2 = xDoc.CreateElement("add");  
    xElem2.SetAttribute("key",AppKey);  
    xElem2.SetAttribute("value",AppValue);  
    xNode.AppendChild(xElem2);  
   }  
   xDoc.Save(Application.ExecutablePath + ".config");  

private void Form1_Load(object sender, System.EventArgs e)
{
//读出版本号,该版本号是在AssemblyInfo.cs中由系统本身设置的,[assembly: AssemblyVersion("1.0")]
//以后要更改,可以改此处的AssemblyInfo.cs中的版本号,例:[assembly: AssemblyVersion("1.1")]
//我们的WEBSERVICE中需要这个数据做为参数

string sVersion = Application.ProductVersion;

//写到App.Cofing文件中,每次调用WEBSERVICE方法时,从App.Cofing中读取版本,你也可以直接使用Application.ProductVersion,我是为了统一管理,全部从config中读取
this.SaveAppConfig("Version",sVersion);
}

//SaveAppConfig函数的内容
public static void SaveAppConfig(string AppKey,string AppValue)
{
   XmlDocument xDoc = new XmlDocument();
   xDoc.Load(Application.ExecutablePath + ".config");

XmlNode xNode;
   XmlElement xElem1;
   XmlElement xElem2;

xNode = xDoc.SelectSingleNode("//appSettings");

xElem1 = (XmlElement)xNode.SelectSingleNode("//add[@key='" + AppKey + "']");
   if ( xElem1 != null ) xElem1.SetAttribute("value",AppValue);
   else
   {
    xElem2 = xDoc.CreateElement("add");
    xElem2.SetAttribute("key",AppKey);
    xElem2.SetAttribute("value",AppValue);
    xNode.AppendChild(xElem2);
   }
   xDoc.Save(Application.ExecutablePath + ".config");
}

7.主要部分,开始调用webservice的方法!
准备工作:1)添加一个WEB引用,(先点菜单"项目"-"添加WEB引用"),在弹出中中输入url的路径:http://localhost/babywebsvc/SoftUpdate.asmx
   2)假定你在开发时的WEBSERVICE的URL:http://localhost/babywebsvc/SoftUpdate.asmx
   3)填入WEB引用名:AutoUpdateWebSvc
   4)点下按纽完成WEB引用的添加

8.在你的Button1_click事件中添加如下CODE,主要使用异步调用

view plaincopy to clipboardprint?
private string svcUser = "";  
private string svcPwd = "";  
private string svcSoftName = "";  
private string svcCurrVersion = "";  
private string svcDnldFileName = "Test.MSI";//下载下来的文件名,  
private byte[] fbyte = null; //下载后的升级文件的内容  
private void Button1_Click(object sender, System.EventArgs e)  
{  
//读取App.config文件中的配置信息  
svcUser = System.Configuration.ConfigurationSettings.AppSettings["user"]; //需要人证的用户名  
svcPwd = System.Configuration.ConfigurationSettings.AppSettings["pwd"];   //认证密码  
svcSoftName = System.Configuration.ConfigurationSettings.AppSettings["babyRecordSoftName"];//软件名称  
svcCurrVersion = System.Configuration.ConfigurationSettings.AppSettings["Version"];//当前版本号  
 
 
   try 
   {  
    AutoUpdateWebSvc.SoftUpdate aSvc = new AutoUpdateWebSvc.SoftUpdate();  
 
    //此处可以改成自己实际应用时的URL,不管WEB引用是动态还是静态,调用都会指向该URL  
    aSvc.Url = "http://localhost/babyWebSvc/SoftUpdate.asmx";  
 
    if(Button1.Text.Trim() == "检 查")  
    {  
     //检查最新版本  
     System.AsyncCallback cb = new AsyncCallback(SearchVersionCallBack);//异步回调方法,并检查是否有高版本的升级软件存在  
     aSvc.BeginSearchVersion(svcSoftName,cb,aSvc);  
    }  
    else if(Button1.Text.Trim() == "升 级")  
    {  
     //开始调用下载服务  
     InvokeDownload(); //函数体见下面的CODE  
    }  
      
   }  
   catch(Exception ex)  
   {  
    MessageBox.Show(ex.Message);  
   }  
}  
 
 
//检查最新版本的异步回调方法  
private void SearchVersionCallBack(System.IAsyncResult ar)  
{  
   if(ar==null)return;  
   if(ar.IsCompleted)  
   {  
    try 
    {  
     AutoUpdateWebSvc.SoftUpdate aSvc = (AutoUpdateWebSvc.SoftUpdate)ar.AsyncState;  
     string sVersion = aSvc.EndSearchVersion(ar);  
     aSvc.Dispose();  
 
       
     if(svcCurrVersion.Trim() == sVersion.Trim())  
      MessageBox.Show"你的软件当前版本已经是最新的了,无需进行升级...");  
     else if((string.Compare(svcCurrVersion.Trim(),sVersion.Trim()))==-1)  
     {  
        
      MessageBox.Show("你的软件当前版本比较低,可以进行升级...");  
      Button1.Text = "升 级";  
     }  
 
    }  
    catch(Exception ex)  
    {  
     MessageBox.Show(ex.Message);  
    }  
   }  
}  
 
 
//调用远程的WEB服务,开始下载  
private void InvokeDownload()  
{  
   try 
   {  
    AutoUpdateWebSvc.SoftUpdate aSvc = new AutoUpdateWebSvc.SoftUpdate();  
    //此处可以改成自己实际应用时的URL,不管WEB引用是动态还是静态,调用都会指向该URL  
    aSvc.Url = "http://localhost/babyWebSvc/SoftUpdate.asmx";  
 
    //开始下载  
    System.AsyncCallback cb = new AsyncCallback(DownloadSoftCallBack);//异步回调方法,保存文件  
    aSvc.BeginDownloadSoft(svcUser,svcPwd,svcDnldFileName,lblVersion.Text.Trim(),cb,aSvc);  
      
   }  
   catch(Exception ex)  
   {  
    MessageBox.Show(ex.Message);  
   }  
}  
 
//下载方法执行完成后,异步回调方法  
private void DownloadSoftCallBack(System.IAsyncResult ar)  
{  
   if(ar==null)  
   {  
    MessageBox.Show("升级过程中出现错误,不能进行升级,请稍后再试...");  
    return;  
   }  
   if(ar.IsCompleted)  
   {  
    try 
    {  
     AutoUpdateWebSvc.SoftUpdate aSvc = (AutoUpdateWebSvc.SoftUpdate)ar.AsyncState;  
     fbyte = aSvc.EndDownloadSoft(ar);  
     aSvc.Dispose();  
 
     //使用线程,保存文件  
     Thread th = new Thread(new ThreadStart(Save2Disk));  
     th.Start();  
 
    }  
    catch(Exception ex)  
    {  
     MessageBox.Show("升级过程中出现错误,"+ex.Message);  
    }  
   }  
}  
 
 
//将下载下来的字节数组保存成文件  
private void Save2Disk()  
{  
   try 
   {  
    FileInfo finfo = new FileInfo(Application.ExecutablePath+svcDnldFileName);  
    if(finfo.Exists)finfo.Delete();//文件存在就删除它  
    Stream stream = finfo.OpenWrite();  
 
    prosBar.Maximum = fbyte.Length;//prosBar是一个进度条  
    prosBar.Minimum = 0;  
    prosBar.Step = 1;  
    int i=0;  
    foreach(byte b in fbyte)  
    {  
     stream.WriteByte(b);  
     prosBar.Value += 1;  
    }  
    stream.Flush();  
    stream.Close();  
 
    DialogResult dr = MessageBox.Show("下载完成,是否现在就安装升级程序...","提示信息",MessageBoxButtons.OKCancel,MessageBoxIcon.Information,MessageBoxDefaultButton.Button1);  
    if(dr == DialogResult.OK)  
    {  
     ExecSetup();//启动下载下来的安装程序,用户可以自己完成  
    }  
   }  
   catch(Exception ex)  
   {  
    MessageBox.Show("升级过程中出现错误,"+ex.Message);  
   }  
   uiButton2.Enabled = true;  

private string svcUser = "";
private string svcPwd = "";
private string svcSoftName = "";
private string svcCurrVersion = "";
private string svcDnldFileName = "Test.MSI";//下载下来的文件名,
private byte[] fbyte = null; //下载后的升级文件的内容
private void Button1_Click(object sender, System.EventArgs e)
{
//读取App.config文件中的配置信息
svcUser = System.Configuration.ConfigurationSettings.AppSettings["user"]; //需要人证的用户名
svcPwd = System.Configuration.ConfigurationSettings.AppSettings["pwd"];   //认证密码
svcSoftName = System.Configuration.ConfigurationSettings.AppSettings["babyRecordSoftName"];//软件名称
svcCurrVersion = System.Configuration.ConfigurationSettings.AppSettings["Version"];//当前版本号

try
   {
    AutoUpdateWebSvc.SoftUpdate aSvc = new AutoUpdateWebSvc.SoftUpdate();

//此处可以改成自己实际应用时的URL,不管WEB引用是动态还是静态,调用都会指向该URL
    aSvc.Url = "http://localhost/babyWebSvc/SoftUpdate.asmx";

if(Button1.Text.Trim() == "检 查")
    {
     //检查最新版本
     System.AsyncCallback cb = new AsyncCallback(SearchVersionCallBack);//异步回调方法,并检查是否有高版本的升级软件存在
     aSvc.BeginSearchVersion(svcSoftName,cb,aSvc);
    }
    else if(Button1.Text.Trim() == "升 级")
    {
     //开始调用下载服务
     InvokeDownload(); //函数体见下面的CODE
    }
   
   }
   catch(Exception ex)
   {
    MessageBox.Show(ex.Message);
   }
}

//检查最新版本的异步回调方法
private void SearchVersionCallBack(System.IAsyncResult ar)
{
   if(ar==null)return;
   if(ar.IsCompleted)
   {
    try
    {
     AutoUpdateWebSvc.SoftUpdate aSvc = (AutoUpdateWebSvc.SoftUpdate)ar.AsyncState;
     string sVersion = aSvc.EndSearchVersion(ar);
     aSvc.Dispose();

if(svcCurrVersion.Trim() == sVersion.Trim())
      MessageBox.Show"你的软件当前版本已经是最新的了,无需进行升级...");
     else if((string.Compare(svcCurrVersion.Trim(),sVersion.Trim()))==-1)
     {
     
      MessageBox.Show("你的软件当前版本比较低,可以进行升级...");
      Button1.Text = "升 级";
     }

}
    catch(Exception ex)
    {
     MessageBox.Show(ex.Message);
    }
   }
}

//调用远程的WEB服务,开始下载
private void InvokeDownload()
{
   try
   {
    AutoUpdateWebSvc.SoftUpdate aSvc = new AutoUpdateWebSvc.SoftUpdate();
    //此处可以改成自己实际应用时的URL,不管WEB引用是动态还是静态,调用都会指向该URL
    aSvc.Url = "http://localhost/babyWebSvc/SoftUpdate.asmx";

//开始下载
    System.AsyncCallback cb = new AsyncCallback(DownloadSoftCallBack);//异步回调方法,保存文件
    aSvc.BeginDownloadSoft(svcUser,svcPwd,svcDnldFileName,lblVersion.Text.Trim(),cb,aSvc);
   
   }
   catch(Exception ex)
   {
    MessageBox.Show(ex.Message);
   }
}

//下载方法执行完成后,异步回调方法
private void DownloadSoftCallBack(System.IAsyncResult ar)
{
   if(ar==null)
   {
    MessageBox.Show("升级过程中出现错误,不能进行升级,请稍后再试...");
    return;
   }
   if(ar.IsCompleted)
   {
    try
    {
     AutoUpdateWebSvc.SoftUpdate aSvc = (AutoUpdateWebSvc.SoftUpdate)ar.AsyncState;
     fbyte = aSvc.EndDownloadSoft(ar);
     aSvc.Dispose();

//使用线程,保存文件
     Thread th = new Thread(new ThreadStart(Save2Disk));
     th.Start();

}
    catch(Exception ex)
    {
     MessageBox.Show("升级过程中出现错误,"+ex.Message);
    }
   }
}

//将下载下来的字节数组保存成文件
private void Save2Disk()
{
   try
   {
    FileInfo finfo = new FileInfo(Application.ExecutablePath+svcDnldFileName);
    if(finfo.Exists)finfo.Delete();//文件存在就删除它
    Stream stream = finfo.OpenWrite();

prosBar.Maximum = fbyte.Length;//prosBar是一个进度条
    prosBar.Minimum = 0;
    prosBar.Step = 1;
    int i=0;
    foreach(byte b in fbyte)
    {
     stream.WriteByte(b);
     prosBar.Value += 1;
    }
    stream.Flush();
    stream.Close();

DialogResult dr = MessageBox.Show("下载完成,是否现在就安装升级程序...","提示信息",MessageBoxButtons.OKCancel,MessageBoxIcon.Information,MessageBoxDefaultButton.Button1);
    if(dr == DialogResult.OK)
    {
     ExecSetup();//启动下载下来的安装程序,用户可以自己完成
    }
   }
   catch(Exception ex)
   {
    MessageBox.Show("升级过程中出现错误,"+ex.Message);
   }
   uiButton2.Enabled = true;
}

9:总结,客户端调用,是从,点击Buttton1开始,搜索版本号,SearchVersion,当找到高版本升级包时,开始执行下载的方法DownloadSoft,然后保存到本地Save2Disk.
不管客户端的调用是同步还是异步,WEBService的方法都是一样写的,只不过同步调用,是直接使用WEBService中的方法名称,异步调用则会由系统自动生成BeginXXX()与EndXXX()的方法名称,提供给你使用

C#程序在线升级代码---webservice相关推荐

  1. 基于串口通信的DSP应用程序在线升级方法

    摘  要:为解决特殊场合DSP程序升级困难的问题,以TMS320F28035为例,介绍了一种基于串口通信的适合于TMS320C2000系列DSP实现程序更新的在线升级方法.描述了该在线升级方法的基本思 ...

  2. C#单exe程序在线升级更新

    有一个小工具,除了配置文件就只有一个exe主程序,以前弄别的工具有引用一些dll,还做了更新器,这个小工具不想弄太复杂,希望保持单exe又具有在线升级的功能,网上看到有人问过同样问题,写下我的方法以作 ...

  3. Cortex-M3单片机的IAP在线升级上位机和下位机

    最近有个项目要做在线升级功能,我也是第一次做,把学习的过程总结下,希望能够帮助到 其他人吧.本篇博客主要介绍两个部分,下位机和上位机. 首先说下要实现功能: 1.上位机能够把APP的bin文件烧写进下 ...

  4. C#做的在线升级小程序

    转自原文C#做的在线升级小程序 日前收到一个小任务,要做一个通用的在线升级程序.更新的内容包括一些dll或exe或.配置文件.升级的大致流程是这样的,从服务器获取一个更新的配置文件,经过核对后如有新的 ...

  5. CRC校验原理及STM32 IAP在线升级程序

    CRC校验原理: 什么是CRC校验? CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定.循环冗余检查(CRC)是一种数据传输检错功能,对数据 ...

  6. stm32-IAP(在线升级程序)

    第一章 背景知识 什么是IAP? IAP的知识网上的各种资料也说的比较明白,在此简单介绍一下.IAP( In Application Programming)即在线应用编程,也就是用户可以使用自己的程 ...

  7. fpga在线升级 linux_Xilinx FPGA程序升级

    Xilixn FPGA提供了一种在线升级的方式,可以通过ICAP指令实现.ICAP(Internal Configuration Access Port) 指的是内部配置访问端口,其主要作用是通过内部 ...

  8. VB.NET在线升级程序源代码,可以独立使用

    这个程序是我做一个办公管理系统的时候用到的,这里有源码,需要的亲拿去研究学习:vb.net在线升级程序: 程序实现了通过vb.net连接远程云服务器,并且从云服务器中获取更新,并且自动下载更新,升级本 ...

  9. stm32f4 usb 升级程序_STM32在线升级之 QiFreeUSBS

    原标题:STM32在线升级之 QiFreeUSBS 写在前面 作为 MCU程序开发者,我经常使用的下载方式是 SWD,然后就是串口.其实我们都知道还有其它的如 JTAG, ISP等常用下载方式,这就是 ...

最新文章

  1. Linux实现ffmpeg H.265视频编码
  2. Python基础教程:元组详细使用
  3. 浏览器工作原理与实践学习笔记
  4. 【转】学习apicloud和IOS之间的模块化使用
  5. Eclipse Git下载问题:Internal error; consult Eclipse error log.
  6. 聊聊零基础的我是如何学python的_零基础学python-4.3 对象的比较
  7. C# 委托事件传递参数
  8. 编译原理语义分析_编译原理 第一章 绪论
  9. 地点坐标拾取,经纬度精确到小数点后6位
  10. Java项目:医院药品管理系统设计和实现(java+Springboot+ssm+mysql+jsp+maven)
  11. 如何使用QGIS下载Google地图的遥感影像
  12. Sakai 2.6 配置
  13. 发光二极管pcb封装图画法_【AD封装】贴片及插件二极管整流桥(带3D)
  14. cmd贪吃蛇(cmd贪吃蛇怎么做)
  15. SMARTS决策引擎实战练习
  16. Guitar Pro2023中文版本下载及简谱功能详细介绍
  17. 玩客云刷入openwrt系统
  18. 实验二 Java基础语法练习-基本数据类型、运算符与表达式、选择结构
  19. WIN10环境英伟达9系显卡tensorflow安装记录及调试过程 CUDA8.0+tensorflow-gpu1.4+CuDNN6.0
  20. apache整合tomcat实现web服务器的动静态资源的分离解析

热门文章

  1. 信息学奥赛一本通 1979:【18NOIP普及组】龙虎斗 | 洛谷 P5016 [NOIP2018 普及组] 龙虎斗
  2. 信息学奥赛一本通 1080:余数相同问题 | OpenJudge NOI 小学奥数/2.1 7647:余数相同问题
  3. 靶形数独(信息学奥赛一本通-T1447)
  4. 小b和回文数(51Nod-2483)
  5. 最小函数值(信息学奥赛一本通-T1370)
  6. 01迷宫(洛谷-P1141)
  7. 铺地毯(信息学奥赛一本通-T1118)
  8. 3 WM配置-主数据-定义仓库编号的控制参数
  9. NOIP2018最终成绩(一等奖名单)
  10. openoffice转化太慢且不能多线程_职场新人众多工作要处理,手足无措咋办?“多线程工作法”来救急...