- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于STM32USB通信程序设计
基于STM32USB通信程序设计
摘 要 针对需要在PC与单片机之间进行高速通信的系统,提出了一种基于STM32系列单片机的解决方案。通过C++结合WINDDK和Driver Studio工具包开发USB驱动和链接库,用MFC开发应用。
【关键词】STM32 USB通信 C++
随着海洋科学的发展,浮标、潜标等观测海洋环境要素的系统越来越受重视,同时,这类系统的可持续工作时间越来越长,挂载的测量仪器也越来越丰富,与之俱来的就是数据的膨胀,这给数据的回收带来了困难。传统的串口通信方式存在传输速度低的问题,加上PC的串口十分有限,笔记本电脑上甚至已普遍取消了串口,在使用时还需要通过其它方式转换,颇为不便。而USB通信不仅在传输速度天然有着优势,对于PC来说,USB接口通常也更为丰富。本方案采用的STM32系列单片机有着高性能、低成本、低功耗的优势,而且封装了丰富的外围设备,还支持USB2.0全速接口,非常符合我们的需求。
1 系统软件架构
PC上软件分为三层:
(1)Application:应用层。
(2)USBIO.dll:链接库。
(3)USB Driver:驱动层。
单片机的程序包含四个部分:
(4)Application:应用层。
(5)Application Interface:用户接口层,提供库内核和应用层之间的接口。
(6)USB Library Core:USB库内核层,该层管理使用USP IP 硬件和USB标准协议的直接传输。
(7)Firmware Library:STM32F10xxx固件库。
在单片机部分,由于ST公司提供了USB库及STM32F10xxx固件库,开发起来较为方便,而PC部分由于需要自行开发驱动,对于大多数应用层的开发者来说,存在较大难度,因此本文主要描述PC端的程序设计。
2 驱动层和链接库
这两层采用C++结合WINDDK和Driver Studio工具包来开发,开发环境为VC6.0。
首先,利用DriverStudio通过代码向导生成这两层源代码的框架,其中有两步需要格外注意:
(1)设置Vendor ID 和Product ID,必须与USB设备固件程序里的设备描述符一致。
(2)添加端点,USB所有的通信都是基于端点,这里我们使用端点2接收数据,通过端点3发送数据。
按照向导配置完后,就可以生成代码框架,该框架已经包含了进行基础通信所必要的代码,只需要针对具体应用作一定优化即可。
3 应用层
应用层采用MFC开发,主要功能是对设备进行参数配置和数据回收,不同的指令会采取不同的读取模式,例如本应用中“读取文件总数”、“读取文件目录”、“读取已存储页数”这三个功能项通信数据量小,于是采用了同步模式,“回收文件”和“回收全部”则通过新建线程在后台完成通信,前台显示回收进度条,通信部分核心代码如下:
void CRecoverDlg::BulkRead(CString sInput) {
UCHAR uchSend[50]= READ_FILE\r\n
DWORD dwSendLen = 11;
UCHAR pUSBSend[256];
pUSBSend[0] = (UCHAR) (dwSendLen+1); //指令前增加一位说明总长度
memcpy(pUSBSend+1,uchSend,dwSendLen);
USBIO_WriteEp(pUSBSend,dwSendLen+1,length,500)//调用链接库接口发送数据
BeginThread();//开启接收线程
}
//! 启动辅助线程控制
bool CRecoverDlg::BeginThread() {
if(!hUSBThread_) { //确保线程没有运行
bContinue_= true;
unsigned int id;
hUSBThread_=(HANDLE)_beginthreadex(NULL,0,USBThreadProc,this,0, id);
if (!hUSBThread_){ EndThread();return false;}
return true;
}
return false;
}
//! 监视线程 ReadUSB Thread 完成监视 并根据配置决定是否完成读写
UINT APIENTRY CRecoverDlg::USBThreadProc(LPVOID lpPara){
DWORD dwCode = ((CRe
您可能关注的文档
最近下载
- 成人脓毒症患者医学营养治疗指南(2025版)解读PPT课件.pptx VIP
- 福建省莆田市莆田四中2024-2025学年高一下学期月考 化学试卷(含解析).docx VIP
- 2025至2030中国运输专用车行业运营态势与投资前景调查研究报告.docx VIP
- 2025至2030国内工程专用车行业运营态势与投资前景调查研究报告.docx VIP
- 电气绝缘电阻测试记录表模板.docx VIP
- 小企业会计制度财会.pdf VIP
- 2025-2026 学年华东师大版八年级数学上学期第一次月考卷.pdf VIP
- 《化工企业燃气加热炉火焰监测和熄火保护技术规范》.pdf VIP
- 2025至2030中国专用车行业运营态势与投资前景调查研究报告.docx VIP
- 管道打压记录表.pdf VIP
文档评论(0)