tzz1983 发表于 2024-11-30 16:17:33

AI-MCU USB_CDC, + 通信大师之桌面上位机软件

本帖最后由 tzz1983 于 2024-11-30 16:35 编辑

最近在学习上位机软件编程,使用的开发环境是 Visual Studio 2017 之MFC,C++语言。
对于熟悉单片机软硬件的工程师,可不一定会编写上位机程序哦,我就是其中不会的那一员 ~~

先说AI-MCU 的USB_CDC吧,AI官方给出的源码范例很好用,也容易懂。

这里有一点很有意思,实现桌面和单片机通信,用USB_CDC很容易,
但是仅仅是实现桌面和单片机通信,是不是可以省去了把收到的数据再从UART发出去?
当然是可以的,这一省可不得了,相当于直接把USB_CDC的传输速率直接提升到了USB_HID.
因为不需要把数据UART了,那传输速的瓶颈就在于USB_HID了,想想看,1-2M的比特率肯定是可以达到的.

我自己也在实验,整合了一个小框架,UCOSII+ USB_CDC ,实验器材为:(屠龙刀)AI32G12K128

在官方USB_CDC范例的基础上稍加更改,去掉了把收到的数据从UART发送出去那部分,
增加了两个使用灵活的收发函数,方便使用:



(屠龙刀)AI32G12K128 可直接运行代码,用USB TYPEC 口 USB直接下载代码,下载后就可以看到串口了,是单串口哦。
代码:


现在来说说桌面软件吧。

很多时候,我们做的产品不需要重新烧录固件,但是客户需要自己修改一些运行参数,显示内容等。
这时候,简单的桌面软件,就非常具有灵活性了。

在学习MFC的同时,我编写了一个很简单的串口通信桌面代码。很简单的那种,大部分代码都是自动生成的,自己也就几十行代码。
其实吧,说是编的,还不如说是抄作业。大部分都是抄别人的,嘿嘿。
不过我建议大家看代码时,也要学会抄作业,抄一遍+少许修改,就学得很会了哦。光看不抄那肯定不行!^-^

上个图看看软件长啥样子:


代码量很少,仅实现了基本功能,当然了,对于学习来说,功能越精简学起来越轻松。那些特别的功能就留到做项目的时候再去花精力吧。
给大家奉上源码,欢迎指教:

代码中使用了第三方串口源码 CSerialPort,(本帖标题为通信大师是沿用了原作者的说法,本人不敢自称通信大师)

CSerialPort项目是一个基于C/C++的轻量级开源跨平台串口类库,
可以轻松实现跨平台多操作系统的串口读写,同时还支持C#, Java, Python, Node.js等
有兴趣的可以百度一下,下载源码来观赏一番,还有源作者自己的介绍和使用说明,非常好的。

CSerialPort 比MFC自身的 MSComm 控件好用,MSComm太老了,现在好多新电脑缺少支持。

这里也介绍一下 CSerialPort在MFC中的使用 步骤

1.首先 Visual Studio 创建一个基于对话框的应用,框架自动生成的那种。

2.将CSerialPort文件夹复制到项目工作目录下,然后在项目中添加6个源文件分别为:
SerialPort.cpp
SerialPortBase.cpp
SerialPortWinBase.cpp
SerialPortInfo.cpp
SerialPortInfoBase.cpp
SerialPortInfoWinBase.cpp

3.需要将6个新添加的cpp文件的预编译头设置为"不使用预编译头",
比如右键【serialport.cpp】-【属性】-【C/C++】-【预编译头】-【预编译头: 不使用预编译头】

4. 增加CSerialPort的必要依赖库 windows下CSerialPort必须的依赖库为setupapi.lib
右键【CommMFC根命名空间】-【属性】-【链接器】-【输入】-【附加依赖项】-添加setupapi.lib

5. 使主对话框继承 CSerialPortListener 如下代码:
class CCommMFCDlg : public CDialogEx, public CSerialPortListener

6. 添加一个虚函数+实现 和一个 串口类变量,如下代码:
private:      
    void onReadEvent(const char *portName, unsigned int readBufferLen);   
    CSerialPort m_SerialPort;

7. 另外按自己的喜好,添加几个Button 两个编辑框,基本完工了,详见项目本身吧。



VCC 发表于 2024-11-30 17:50:44

本帖最后由 VCC 于 2024-11-30 18:23 编辑

关注!
尝试复现!

下载并解压



删除掉遗留的临时文件(非常建议楼主今后分享代码时,删掉工具链构建过程中产生的临时文件!)




启动Visual Studio解决方案文件,sln后缀


由于楼主用的VS2017,而我用的是VS2022,所以会对C++项目文件进行自动升级


升级完成



提示我的电脑里缺MFC库,遂安装MFC库



我使用的最新的Visual Studio 2022,与之配套的也就是v143生成工具



安装之!




下载飞快

安装完成!重新打开!


尝试编译,报了很多错


上网查了查,发现把这里改成【不使用预编译头】这样可以解决上述问题


另一处要修改的是,这个文件开头加一个头文件 #include <iostream>


成功编译并运行!!!
楼主威武!


VCC 发表于 2024-11-30 18:25:51

VCC 发表于 2024-11-30 17:50
关注!
尝试复现!


微调一下Release设定




Release版本的32位exe串口助手!

VCC 发表于 2024-11-30 19:13:02

VCC 发表于 2024-11-30 18:25
微调一下Release设定




经过实测,可以正确打开两个串口(已经在USB串口模块上将二者交叉连接)

数据也能传输



现有问题:

[*]更改波特率、数据位、停止位、校验位设定后,不会立即生效,必须重新关闭&打开串口后,才会生效
[*]不支持检测程序启动后新加入的串口,即【串口号】菜单仅在程序启动时更新

tzz1983 发表于 2024-12-1 16:25:52

本帖最后由 tzz1983 于 2024-12-1 22:05 编辑

VCC 发表于 2024-11-30 19:13
经过实测,可以正确打开两个串口(已经在USB串口模块上将二者交叉连接)

数据也能传输

现有问题:
更改波特率、数据位、停止位、校验位设定后,不会立即生效,必须重新关闭&打开串口后,才会生效
不支持检测程序启动后新加入的串口,即【串口号】菜单仅在程序启动时更新
感谢测评,确实是这样的,当前只在程序打开的时候枚举一次串口, 并且也仅在打开串口时设置一次串口参数。
如果要实现你说的功能,需要再加一些代码。

现在虽然有些像串口助手的样子,不过我做它的目的并不是为了实现一个串口助手,
好用的串口助手现在已经有很多了。

串口通信本身可以不需要任何窗口和显示,如下面这个小玩意:


把文字或图片生成点阵后发送单片机,不需要任何串口参数和显示,因为双方都是已知的。
仅通知操作结果是否成功即可。

做这个串口通信的主要目的是把 “串口通信” 本身,嵌入到我们自己的桌面应用,和产品应用中去,这样才是最终的目的




VCC 发表于 2024-12-1 17:22:21

tzz1983 发表于 2024-12-1 16:25
感谢测评,确实是这样的,当前只在程序打开的时候枚举一次串口, 并且也仅在打开串口时设置一次串口参数。 ...

{:4_250:}

胡嘉鑫 发表于 2024-12-1 20:17:46

{:4_197:}学习

xxkj2010 发表于 2024-12-1 20:49:27

vs的兼容性有点差,用vs2019打开总是提示这错那错。

tzz1983 发表于 2024-12-1 22:04:55

xxkj2010 发表于 2024-12-1 20:49
vs的兼容性有点差,用vs2019打开总是提示这错那错。

按1楼的步骤自己移植到相应的版本即可,不明白的地方也可以百度一下原作者,说的比较详细
页: [1]
查看完整版本: AI-MCU USB_CDC, + 通信大师之桌面上位机软件