基于STM32USB通信程序设计.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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

文档评论(0)

189****7685 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档