wkhn
认证:优质创作者
所在专题目录 查看专题
一种采用CAN总线方式升级F28035芯片Flash的方法(一)
一种采用CAN总线方式升级F28035芯片Flash的方法(二)
一种采用CAN总线方式升级F28035芯片Flash的方法(三)
作者动态 更多
一种采用CAN总线方式升级F28035芯片Flash的方法(三)
2024-05-13 15:31
一种采用CAN总线方式升级F28035芯片Flash的方法(二)
2024-05-13 15:31
一种采用CAN总线方式升级F28035芯片Flash的方法(一)
2024-05-13 15:31
STM32G4系列MCU——数字电源入门(4)
2023-03-14 10:46
STM32G4系列MCU——数字电源入门(3)
2023-03-13 20:05

一种采用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#写的一个上位机
觉得内容不错的朋友,别忘了一键三连哦!
赞 12
收藏 14
关注 583
成为作者 赚取收益
全部留言
0/200
  • dy-xlPudszg 3星期前
    老师,能不能发我一下资料,谢谢! 13****@****.com
    回复 1条回复
  • shanzhihun 3星期前
    老师,能不能发我一下资料,谢谢! 33****@****.com
    回复 1条回复
  • dy-hqaLNQF2 05-09 13:35
    老师,能不能发我一下资料,谢谢! 93****@****.com
    回复 1条回复
  • dy-G4SFbG86 04-13 11:33
    老师,能不能发我一下资料,谢谢! ou****@****.com
    回复 1条回复
  • dy-hAMQMNpf 04-07 13:44
    老师,能不能发我一下资料,谢谢! 74****@****.com
    回复 1条回复
  • dy-hAMQMNpf 04-07 13:43
    老师,能不能发我一下资料,谢谢! 74****@****.com
    回复 1条回复
  • dy-2Ta5Db76 03-30 02:34
    老师,能不能发我一下资料,谢谢! 69****@****.com
    回复 1条回复
  • dy-yf9cuqwp 03-24 17:24
    老师,能不能要一下完整的资料。谢谢!940496519@qq.com,祝老师身体健康,生活如意。🌹
    回复
  • dy-yf9cuqwp 03-24 17:20
    老师,能不能发我一下资料,谢谢! 94****@****.com
    回复 1条回复
  • jshayouyun 03-15 11:07
    老师,能不能发我一下资料,谢谢! js****@****.com
    回复 1条回复
  • dy-sZEClizN 03-04 16:09
    老师您好!请问可以资料发一下吗,没有上位机下载软件,谢谢~~。509067867@qq.com
    回复
  • dy-JJ1Fhxzq 03-04 10:59
    老师,能不能发我一下资料,谢谢! ye****@****.com
    回复 1条回复
  • dy-B5995S2t 03-03 18:28
    老师,能不能发我一下资料,谢谢! 48****@****.com
    回复 1条回复
  • dy-yJ2E8n4N 02-28 13:50
    老师,能不能发我一下资料,谢谢! 16****@****.com
    回复 1条回复
  • 鹰击长空2012 02-25 16:06
    老师,能不能发我一下资料,谢谢!
    回复
  • dy-A18irpYK 02-24 09:01
    老师,能不能发我一下资料,谢谢! 22****@****.com
    回复 1条回复
  • shanzhihun 02-11 18:44
    老师,能不能发我一下资料,谢谢! 33****@****.com
    回复 1条回复
  • dy-h16t9Dyk 02-10 09:54
    老师,能不能发我一下资料,谢谢! le****@****.com
    回复 2条回复
  • 熊紅 02-03 23:22
    老师,能不能发我一下资料,谢谢! x3****@****.com
    回复 1条回复
  • 发烧小峰 02-01 15:38
    老师,能不能发我一下资料,谢谢! bc****@****.com
    回复 1条回复