打印
[DemoCode下载]

史上最精简的Nano_USB虚拟串口源代码

[复制链接]
2111|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gaoyang9992006|  楼主 | 2015-2-13 19:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
版权:Angus

你见过这么精简的USB虚拟UART串口代码吗?  反正我是第一次, 代码大小只有 1.28K    Nano_USB_VCOM.zip (71.67 KB, 下载次数: 144)
新唐最精简的 最容易学的 USB虚拟串口源代码

    编译烧录到Nano120/130 板子上后, 连上USB线, PC机识别出未知设备,手动安装,或更新驱动程序. PC端驱动程序在软件包的Windows目录里. 安装好后会显示COM口号,或者从PC机硬件管理那里看到PC机分配的COM号.
    然后打开超级终端,或用串口工具,打开对应串口,就可以看到有数据发过来, 从串口工具发送abcdefgh, 会变成大写返回.
沙发
gaoyang9992006|  楼主 | 2015-2-13 19:31 | 只看该作者
//=======================================================================================
// Copyright (C) 2013 Nuvoton Technology(SH) Corp. All rights reserved.
//=======================================================================================
#include  "nano1xx.h"
#include  "nano1xx_usb_1.h"

volatile  uint32_t  Vcom_TxSize ;                          //待发送字符个数

//字符串*ptr输出到USB虚拟串口
void Send_to_VCOM(uint8_t *pStr, uint32_t Num)
{
  uint8_t *ptr = (uint8_t *)(USBD_SRAM_BASE + USB->End[2].BUFSEG) ;  //USB发送缓存

  Vcom_TxSize = Num ;                            //发送字符个数
  while(Num--)  *ptr++ = *pStr++ ;               //把待发送数据移到USB发送缓存
  USB->End[2].MXPLD = Vcom_TxSize ;              //发送开始
}

//=======================================================================================
int32_t main(void)
{
  int32_t i;
  uint8_t Str[9] ;

  UNLOCKREG();
    CLK->PWRCTL |= (CLK_PWRCTL_HXT_EN | CLK_PWRCTL_LXT_EN);          
    CLK->PLLCTL = (CLK_PLLCTL_PLLSRC_HIRC | PLL_IN_12M_OUT_96M);             //PLL=96MHz
    while((CLK->CLKSTATUS & CLK_CLKSTATUS_PLL_STB) == 0);
    CLK->CLKDIV0 = (CLK->CLKDIV0&(~CLK_CLKDIV0_USB_MASK))|USB_CLK_DIVIDER(1); //USB二分频
    CLK->CLKDIV0 = (CLK->CLKDIV0 & ~CLK_CLKDIV0_HCLK_MASK) | 2;              //HCLK三分频
    CLK->CLKSEL0 = (CLK->CLKSEL0 & ~CLK_CLKSEL0_HCLK_MASK) | CLK_CLKSEL0_HCLK_PLL ;         
  LOCKREG();

  USB_Init() ;

  Str[0] ='\n' ;
  Str[1] = 0x30 ;
  Vcom_TxSize = 0 ;

  while(1){
    for(i=0;i<9000000;++i) ;                               //延时
    if(++Str[1] > 0x39) Str[1] = 0x30 ;                    //数字加1, 到10变0
    if(Vcom_TxSize == 0)   Send_to_VCOM("\nUSB_VCOM is OK !",17);
    while(Vcom_TxSize) ;                                   //等上个字符串发送结束
    Send_to_VCOM((uint8_t*)Str, 2) ;   
  }
}

// 相当于发送结束中断, 可以开始发送下一包数据了 =========================================
void USB_Tx_OVER(void)
{
  Vcom_TxSize = 0 ;                              //USB数据发送远毕, 这个变量清零供查寻用
}

// 相当于接收中断, 收到数据, 等待处理 ===================================================
void USB_Rx_Data(void)
{
  uint32_t RxNum = USB->End[3].MXPLD ;                          //收到的字节个数, 最多64个
  uint8_t *ptr = (uint8_t *)(USBD_SRAM_BASE + USB->End[3].BUFSEG) ;  //USB接收缓存     
  uint8_t *p =   (uint8_t *)(USBD_SRAM_BASE + USB->End[2].BUFSEG) ;  //USB发送缓存                                          

  while(RxNum--) *p++ = *ptr++ - 0x20 ;                    //字母变大写发送出去
  USB->End[2].MXPLD = USB->End[3].MXPLD ;
}                                                //退出这个函数后会重新启动数据接收


使用特权

评论回复
板凳
598330983| | 2015-2-13 19:52 | 只看该作者
没看懂咋回事啊。

使用特权

评论回复
地板
598330983| | 2015-2-13 19:53 | 只看该作者
每个函数做个解释比较好啊。

使用特权

评论回复
5
mintspring| | 2015-2-15 15:50 | 只看该作者
我看怎么就是USB转串口啊?

使用特权

评论回复
6
cowboy2014| | 2015-2-15 17:19 | 只看该作者
插上设备需要安装驱动吗?

使用特权

评论回复
7
mintspring| | 2015-2-28 07:22 | 只看该作者
在线安装驱动

使用特权

评论回复
8
mintspring| | 2015-2-28 07:48 | 只看该作者
其实是转的吧?

使用特权

评论回复
9
lovecat2015| | 2015-3-25 20:15 | 只看该作者
楼主,到处都是你的身影
你真是法力无边啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:西安公路研究院南京院
简介:主要工作从事监控网络与通信网络设计,以及从事基于嵌入式的通信与控制设备研发。擅长单片机嵌入式系统物联网设备开发,音频功放电路开发。

1963

主题

15938

帖子

208

粉丝