手边有个项目要用到USB传数据到主机,虽然有很多种方式,但最后还是选择了USB虚拟串口模式,将数据上传至pc端;

然而这就涉及到了移植问题,在keil下官方已经给出了一个完整的USB TO VCOM的demo,但在我的主机上装的是keil 4.22 版的(demo在C:\Keil\ARM\Examples\ST\STM32F10xUSBLib\Demos,盘符按自己的实际安装位置找),而我要用的函数库是3.5版的,显然会出现很多关于版本兼容的问题。

首先移植时候,打开demo下USBtoVCOM的程序工程,看到里面有不少usblib的文件看看都用到了那些文件,全数拷贝出来到另外建立的文件中,包括:

C:\Keil\ARM\Examples\ST\STM32F10xUSBLib\Demos\Virtual_COM_Port\include下的所有7个头文件、

C:\Keil\ARM\Examples\ST\STM32F10xUSBLib\Demos\Virtual_COM_Port\source下的所有8个源文件、

C:\Keil\ARM\RV31\LIB\ST\STM32F10x\USB下的usb库文件、

C:\Keil\ARM\INC\ST\STM32F10x\USB下的usb库文件头文件;

然后,用3.5的库文件重新建立一个工程,将刚复制的所有文件,在此工程下建立新的目录放进去,然后就是加载这些源文件,注意除了原来的复制过来的main.c/stm32f10x_it.c文件不加入工程。

最后,是修改其中的文件中的库关系,将所有"stm32f10x_lib.h"的文件修改为“stm32f10x.h"的头文件,其中”platform_config.h“文件中包涵一个”“#include "stm32f10x_type.h"头文件要将其修改为”stm32f10x.h"的头文件。至此编译器当能透过编译。然后将demo复制过来的main函数中的

Set_System();//系统初始化

Set_USBClock();//设置USB时钟

USB_Interrupts_Config(); //配置USB中断

USB_Init();//初始化USB

复制到当前建立的工程main函数中,然后在将

if ((count_out != 0) && (bDeviceState == CONFIGURED))

{

USB_To_USART_Send_Data(&buffer_out[0], count_out);

count_out = 0;

}

函数代码复制进去,现在编译下可以运行代码了,但是连接usb线的时候就是无法安装驱动,就是连接不上。这就是库代码的问题了,其中在stm32f10x_it.c的文件中有一个中断函数要复制到当前建立的工程文件中的stm32f10x_it.c代码下;

void USB_LP_CAN_RX0_IRQHandler(void)

{

USB_Istr();

}

*******************************************************************************/

void USART1_IRQHandler(void)

{

if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)

{

/* Send the received data to the PC Host*/

USART_To_USB_Send_Data();

}

}

然后,运行代码的时候,还是同样无法安装驱动;在仔细检查后发现usb的中断入口向量函数不对,于是上面的代码改成:

void USB_LP_CAN1_RX0_IRQHandler(void)

{

USB_Istr();

}

这一下运行的可以成功找到驱动,终于连接了。

下面测试下能否收发数据:把以下代码注释掉重新编写一个收发函数;

if ((count_out != 0) && (bDeviceState == CONFIGURED))

{

USB_To_USART_Send_Data(&buffer_out[0], count_out);

count_out = 0;

}

编写好的收发函数如下:

if (count_out != 0) //判断有无数据接收到

{

if(buffer_out[0]==0x01){GPIO_ResetBits(GPIOB, GPIO_Pin_14 );

//                           USB_Send_Data("LED1 点亮下一个 \n");

USB_Send_Data((u8*)TEXT_Buffer);

count_out=0;

} //如果接收到的输出是0X01,点亮led1

if(buffer_out[0]==0x02){GPIO_ResetBits(GPIOB, GPIO_Pin_12 );

USB_Send_Data("LED2 点亮下一个 \n");

count_out=0;

}

//如果接收到的输出是0X02,点亮led2

if(buffer_out[0]==0x03){GPIO_ResetBits(GPIOB, GPIO_Pin_13 );

USB_Send_Data("LED3 点亮下一个 \n");

count_out=0;

}

//如果接收到的输出是0X03,点亮led3

if(buffer_out[0]==0x04){GPIO_SetBits(GPIOB, GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 );

USB_Send_Data("LED 全灭下一个 \n");

count_out=0;

} //如果接收到的输出是0X04,//关闭3个LED

}

试试收发,

下面就是大家很期待的源代码了

先上PC端驱动文件:

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

stm32usb做虚拟串口和键盘_关于stm32f103的USB虚拟串口程序移植相关推荐

  1. linux串口 接收 字符串_非常好用的 Win10 串口调试助手

    完美适配高分屏. 解决大部分win32类软件在高分屏模糊问题. 1.自定义接收显示控件. 大量文本显示时不卡顿. 2.发送或接收可按 "字符串 ASCII"或"HEX十六 ...

  2. 安卓虚拟pc悬浮键盘_文章荣耀V20云电脑体验:玩PC游戏

    近期荣耀V20云电脑的话题成为科技领域的热点,很多人以为"云电脑"就是此前荣耀"无线投屏",也有人称后者为小屏变大屏.事实并非如此,云电脑与无线投屏是截然不同的 ...

  3. java虚拟机能自动处理 异常_对于非运行时异常,程序中一般可不做处理,由java虚拟机自动...

    1.Java异常机制 Java把异常当做对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类.Java中的异常分为两大类:错误Error和异常Exception,Java ...

  4. plc和pc串口通讯接线_让你搞懂PLC串口通讯和通讯接口,这东西估计没几个能说清楚~...

    电力作业人员在使用PLC的时候会接触到很多的通讯协议以及通讯接口,最基本的PLC串口通讯和基本的通讯接口你都了解吗? 1,什么是串口通讯? 串口是计算机上一种非常通用设备通信的协议(不要与通用串行总线 ...

  5. linux java串口读写权限_解决linux下java读取串口之权限问题 No permission to create lock file. | 学步园...

    在终端或IDE中运行java读取串口程序时,总是报告如下信息: [lhwtouch@localhost root]$ java Main Experimental: JNI_OnLoad called ...

  6. qt 串口粘包_用Qt 5写一个串口收发桌面工具

    今天用Qt写了一个串口收发工具,记录下整个流程. 1.项目工程布局 2.ui文件布局 3.widget.h文件 #ifndef WIDGET_H #define WIDGET_H #include # ...

  7. 用python做一个银行取款系统_我的第一个Python小程序,大老虎银行存取款机程序!支持转账...

    [Python] 纯文本查看 复制代码import time banksql = [ {"card_id": "6228881234567000", " ...

  8. msp430g2553串口接受数据_详细解读:MSP430G2553单片机串口通信

    MSP430的不同型号,其串行通讯工作模式是一样的.以MSP430G2553为例进行说明.MSP430G2553是20个引脚的16位单片机.具有内置的16位定时器.16k的FLASH和512B的RAM ...

  9. 华为虚拟home键关闭_华为P20怎么隐藏虚拟键?前置指纹键可轻触返回!

    华为P20采用新一代HUAWEIFullViewDisplay屏幕技术,超高屏占比及极窄边框,带来沉浸式视觉感官体验,游戏娱乐更酣畅,显示信息更多,阅读更高效.采用双面玻璃机身设计,玻璃弧度曲线设计符 ...

最新文章

  1. 黑客提交漏洞先获感谢后被举报 网络安全行业或现标志性事件
  2. html 文件、图片、txt 下载 链接和按钮
  3. 【学习笔记】block、inline(替换元素、不可替换元素)、inline-block的理解
  4. Python 的6个日期时间库
  5. 如何在SAP Spartacus里增添自定义的配置条目
  6. Maven3版本的超级POM位置及中央仓库位置
  7. ASP.NET MVC - 用户验证和权限验证
  8. 首个万人远程培训项目顺利启动
  9. cadcene17.4软件汉化
  10. 贱人工具箱使用技巧4——标注公差
  11. 远程时间管理软件 - 工时通
  12. 中国水墨动画系列 内容简介
  13. Windows 徽标键相关的快捷键
  14. xlrd,xlwt操作excel个人总结 自动化办公
  15. java graphics2d 绘图_java GUI Graphics2D 绘图
  16. 301、404、200、304、500等HTTP状态,代表什么意思?
  17. midi java_java midi音乐文件播放器
  18. python数字转大写字母_python变量名称如何转化为大写字母?
  19. 电子计算机显示屏不亮了,电脑显示屏不亮怎么回事|电脑显示屏不亮如何处理...
  20. Qt视频剪辑软件开发(一):开发步骤介绍

热门文章

  1. 执行Dockerfile构建基础镜像,建立python工作环境
  2. 笔记:awesome-chatops摘要
  3. 知识图谱最新权威综述论文解读:实体发现
  4. 2 计算机组成原理第二章 数据的表示和运算 定点数运算 浮点数运算
  5. P1110 [ZJOI2007]报表统计
  6. 因HTTP的Header长度过长导致下载文件名出现乱码的问题
  7. JDBC-01-快速入门
  8. 分类算法支持向量机(SVM) 简介与入门
  9. linux怎么抓sip包,Ubuntu下使用Wireshark进行抓包分析(含SIP和RTP包)
  10. 计算机网络画出发送窗口变化,2010年7月计算机网络原理试题及答案