找回密码
 立即注册
查看: 706|回复: 8

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-30 07:46:22

33

主题

1079

回帖

2319

积分

荣誉版主

积分
2319
发表于 2024-11-30 16:17:33 | 显示全部楼层 |阅读模式
本帖最后由 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发送出去那部分,
增加了两个使用灵活的收发函数,方便使用:

截图202411301601211233.jpg

(屠龙刀)AI32G12K128 可直接运行代码,用USB TYPEC 口 USB直接下载代码,下载后就可以看到串口了,是单串口哦。
代码: uCOS-II_USB_CDC - 副本.rar (208.69 KB, 下载次数: 40)


现在来说说桌面软件吧。

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

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

上个图看看软件长啥样子:
截图202411301606222096.jpg

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

代码中使用了第三方串口源码 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 两个编辑框,基本完工了,详见项目本身吧。



1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:123
  • 最近打卡:2025-04-19 16:12:35
已绑定手机

60

主题

777

回帖

4001

积分

论坛元老

自定义头衔

积分
4001
发表于 2024-11-30 17:50:44 | 显示全部楼层
本帖最后由 VCC 于 2024-11-30 18:23 编辑

关注!
尝试复现!
截图202411301759173863.jpg
下载并解压


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



截图202411301758169924.jpg
启动Visual Studio解决方案文件,sln后缀

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

截图202411301811535975.jpg
升级完成


截图202411301750425338.jpg
提示我的电脑里缺MFC库,遂安装MFC库


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


截图202411301753149921.jpg
安装之!


截图202411301754504061.jpg

下载飞快

安装完成!重新打开!

截图202411301812511665.jpg
尝试编译,报了很多错

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

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

截图202411301817316627.jpg
成功编译并运行!!!
楼主威武!


联系我请点击左下角的【回复】按钮,否则我收不到消息提
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:123
  • 最近打卡:2025-04-19 16:12:35
已绑定手机

60

主题

777

回帖

4001

积分

论坛元老

自定义头衔

积分
4001
发表于 2024-11-30 18:25:51 | 显示全部楼层
VC*** 发表于 2024-11-30 17:50
关注!
尝试复现!

微调一下Release设定


截图202411301823475876.jpg

Release版本的32位exe串口助手!
CommMFC.exe (122.5 KB, 下载次数: 36)
联系我请点击左下角的【回复】按钮,否则我收不到消息提
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:123
  • 最近打卡:2025-04-19 16:12:35
已绑定手机

60

主题

777

回帖

4001

积分

论坛元老

自定义头衔

积分
4001
发表于 2024-11-30 19:13:02 | 显示全部楼层
VC*** 发表于 2024-11-30 18:25
微调一下Release设定


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

数据也能传输
截图202411301910348136.jpg


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

点评

确实是这样的,当前只在程序打开的时候枚举一次串口, 并且也仅在打开串口时设置一次串口参数。 这仅是一个开头,后面添些代码就能实现了。 现在虽然有些像串口助的的样子,不过我做它的目的并不是为了实了一个  详情 回复 发表于 2024-12-1 16:25
联系我请点击左下角的【回复】按钮,否则我收不到消息提
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-30 07:46:22

33

主题

1079

回帖

2319

积分

荣誉版主

积分
2319
发表于 2024-12-1 16:25:52 | 显示全部楼层
本帖最后由 tzz1983 于 2024-12-1 22:05 编辑
VC*** 发表于 2024-11-30 19:13
经过实测,可以正确打开两个串口(已经在USB串口模块上将二者交叉连接)

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

感谢测评,确实是这样的,当前只在程序打开的时候枚举一次串口, 并且也仅在打开串口时设置一次串口参数。
如果要实现你说的功能,需要再加一些代码。

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

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

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

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




回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:123
  • 最近打卡:2025-04-19 16:12:35
已绑定手机

60

主题

777

回帖

4001

积分

论坛元老

自定义头衔

积分
4001
发表于 2024-12-1 17:22:21 | 显示全部楼层
tzz1*** 发表于 2024-12-1 16:25
感谢测评,确实是这样的,当前只在程序打开的时候枚举一次串口, 并且也仅在打开串口时设置一次串口参数。 ...

联系我请点击左下角的【回复】按钮,否则我收不到消息提
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:75
  • 最近打卡:2025-05-02 21:21:00
已绑定手机

0

主题

130

回帖

178

积分

注册会员

积分
178
发表于 2024-12-1 20:17:46 来自手机 | 显示全部楼层
学习
造就完了
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:521
  • 最近打卡:2025-05-02 09:38:13

109

主题

1900

回帖

5214

积分

论坛元老

积分
5214
发表于 2024-12-1 20:49:27 | 显示全部楼层
vs的兼容性有点差,用vs2019打开总是提示这错那错。

点评

按1楼的步骤自己移植到相应的版本即可,不明白的地方也可以百度一下原作者,说的比较详细  详情 回复 发表于 2024-12-1 22:04
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-30 07:46:22

33

主题

1079

回帖

2319

积分

荣誉版主

积分
2319
发表于 2024-12-1 22:04:55 | 显示全部楼层
xxkj*** 发表于 2024-12-1 20:49
vs的兼容性有点差,用vs2019打开总是提示这错那错。

按1楼的步骤自己移植到相应的版本即可,不明白的地方也可以百度一下原作者,说的比较详细
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 22:16 , Processed in 0.135646 second(s), 111 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表