一种采用CAN总线方式升级F28035芯片Flash的方法(三)

四、PC端上位机的开发

      用C#开发上位机是工控领域比较好的选择,因为C#与C/C++的语法比较相似,且编译出来的代码比Python小的多,速度也快。与C++比起来,C#自动释放资源回收垃圾,不容易产生内存泄漏。

      上位机要实现的功能在这个项目中比较简单,分为两部分:

    1. out格式文件的处理
    2. CAN数据的收发

      作者用的是Visual Studio 2022。首先是实现周立功CAN盒的收发功能。周立功的CAN盒是支持二次开发的。因此,可以从周立功的官方网站https://manual.zlg.cn/web/#/61/5359上下载对应的开发库。

首先,将周立功的CAN盒的支持库放入C#工程文件夹中,同时还要将hex2000.exe放入,方便直接调用。

做完这些以后,开始进行上位机界面的设计。

然后看一下C#文件夹的结构

先看"zlgcan.cs"文件。

该文件其实可以在周立功官方的例程中找到。定义了zlgcan.dll中的一些结构体和方法。注意,因为zlgcan.dll是用C++开发的,是非托管代码。C#中不能直接使用,所以每个结构体前要用[StructLayout(LayoutKind.Sequential)]注明。同样在非托管代码中调用方法,用下面的方式

接下来,也是官方例程提供的一个文件recvdatathread.cs,用于CAN的接收。主要功能就是在UI线程之外再开辟一个辅助线程,专门用于CAN数据的接收,防止CAN大数据量的接收影响UI界面的操作。

下面先实现对.out文件的转换功能。

当按下“选择程序源文件”按键时,在主窗体文件FormMain.cs中,会触发下面的事件

 private void button_ProgramDownload_Click(object sender, EventArgs e)
 {
     OpenFileDialog openFileDialog = new OpenFileDialog();
     openFileDialog.Filter = "程序源代码|*.out";
     DialogResult result = openFileDialog.ShowDialog();
     var openFileName = openFileDialog.FileName;
     if (result == DialogResult.OK)
     {
         textBox_FileName.Text = openFileDialog.FileName;
     }
     System.Diagnostics.Process process = new System.Diagnostics.Process();
     process.StartInfo.FileName = "hex2000.exe";                       // 调用外部程序将.out转换可以传输的代码
     process.StartInfo.Arguments = openFileName + " -a -boot -gpio8 -o F28035_FlashBoot.txt";
     process.Start();
     timer2.Enabled = true;          // 要等待1s,在F28035_FlashBoot.txt文件生成后再载入该文件
     button_ProgramDownload.Text = "正在刷新";
     button_ProgramDownload.Enabled = false;
 }

先通过对话框,选择要写入的app文件(.out输出文件),得到.out文件的路径和文件名。

然后,通过实例化一个System.Diagnostics.Process类,就可以调用外部的hex2000.exe程序。

System.Diagnostics.Process process = new System.Diagnostics.Process();
process.StartInfo.FileName = "hex2000.exe";                       // 调用外部程序将.out转换可以传输的代码
process.StartInfo.Arguments = openFileName + " -a -boot -gpio8 -o F28035_FlashBoot.txt";
process.Start();

注意,hex2000的参数是"-a -boot -gpio8 -o 指定输出文件名"。在这里,指定了输出的文件名,后缀是.txt而不是默认的.a00。其实,后缀不重要,可以随便写,最终生成的都是文本文件。

然后,要等待一段时间,这里作者选择等待1秒,主要是hex2000转换文件需要一定的时间。当用timer2定时器定时1秒到达后,定义一个方法来处理生成的文件。

先将文件读入内存中,再将内存文件中的“\r\n”回车换行符去掉,然后将文件以空格为分隔符转换成一个整型数组,同时得到数组的长度。

这时输出文件的使命就完成了,释放文件资源,同时删除hex2000生成的文件。

最后使能一个定时器,用做CAN收发状态机FSM()的定时。

下面,来实现CAN的收发功能。

当点击“连接设备”按键时,会触发CAN盒连接事件。CAN设备的连接是分下面几部分构成:

  1. 根据选择的设备类型和设备索引号,通过zlgcan.dll内部的Method.ZCAN_OpenDevice库函数,打开can设备,并返回一个设备句柄。
  2. 用Method.ZCAN_SetValue函数设置CAN通讯的波特率。
  3. 根据先前得到的设备句柄、波特率,再将CAN的帧类型、CAN_ID滤波值、发送模式做为参数传入到zlgcan.dll内部的Method.ZCAN_InitCAN初始化函数,当成功完成初始化后,会返回一个can设备通道的句柄。

经过上面三个步骤后,CAN盒就可以收发数据了。

当CAN接收到大量数据后,处理数据的时间会变长,将会影响UI线程的响应,导致UI界面变的卡顿,降低用户的体验。因此,要将CAN的接收函数,重新开一个辅助线程,这样就不会影响UI主线程的响应。

当前面的工作完成后,通过启动timer1定时器,定时执行一个数据发送状态机FSM()。该函数的作用就是将前面.out文件转换成的数组的数据,以段为单位,通过can总线发送给MCU,同时接收MCU返回的数据。这个通讯协议,可以按照自己方式拟定,并没有固定的格式。

最终的效果:

附件中提供上位机的源码下载。

程序可以成功连接CAN盒;能够正常接收发送数据;可以调用hex2000将.out进行文件转换生成数组。但是去掉了CAN数据发送状态机方法FSM(),并不能像上面动画一样完成MCU的app刷写。所以读者需要编写自己的通讯协议,来完成app代码的传输。(完)

声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
本篇所含全部资料,点击此处留下邮箱我会发给你
资料明细:C#写的一个上位机
觉得内容不错的朋友,别忘了一键三连哦!
赞 4
收藏 4
关注 469
成为作者 赚取收益
全部留言
0/200
  • dengyijun103 06-13 14:15
    给老师大大的赞,无私奉献精神 谢谢老师:dengyijun103@163.com
    回复
  • dy-I9g9cuTq 06-08 18:52
    老师,能不能发我一下资料,谢谢! ql****@****.com
    回复 2条回复
  • yangwenlong 06-02 15:30
    老师,能不能发我一下资料,谢谢! ya****@****.com
    回复 1条回复
  • dy-biMUqs11 05-25 11:52
    老师,能不能发我一下资料,谢谢! 25****@****.com
    回复 3条回复
  • dy-4QzgwQ2z 05-22 12:17
    老师,能不能发我一下资料,谢谢! 19****@****.com
    回复 4条回复
  • 电气小学生8 05-21 21:43
    老师,能不能发我一下资料,谢谢! 52****@****.com
    回复 1条回复
  • 电气小学生8 05-21 21:43
    老师,能不能发我一下资料,谢谢! 52****@****.com
    回复 5条回复
  • 电气小学生8 05-21 21:43
    老师,能不能发我一下资料,谢谢! 52****@****.com
    回复 2条回复
  • kaimi 05-16 07:11
    老师,能不能发我一下资料,谢谢! 41****@****.com
    回复 4条回复
  • kaimi 05-16 07:11
    老师,能不能发我一下资料,谢谢! 41****@****.com
    回复 3条回复
  • dy-N73JYKAz 05-13 19:38
    老师,能不能发我一下资料,谢谢! 19****@****.com
    回复 4条回复