你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:杂志经典 / 网络与通信
4.16 USB虚拟串口通信(下)
 

(3)USB读函数主要完成从PC端接受数据工作。与其相对应的写函数笔者在此不再赘述,完整的工程代码可以向笔者索取。
static uint AT91F_UDP_Read(AT91PS_CDC pCdc, char *pData, uint length)
{
 //变量及结构体声明
 while (length)
 {
  if ( !AT91F_UDP_IsConfigured(pCdc) )
   break;
  AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, 2);
  if ( pUdp->UDP_CSR[AT91C_EP_OUT] & currentReceiveBank )
  {
   packetSize = MIN(pUdp->UDP_CSR[AT91C_EP_OUT] >> 16, length);
   length -= packetSize;
   if (packetSize < AT91C_EP_OUT_SIZE)
    length = 0;
   while(packetSize--)
    pData[nbBytesRcv++] = pUdp->UDP_FDR[AT91C_EP_OUT];
   pUdp->UDP_CSR[AT91C_EP_OUT] &= ~(currentReceiveBank);
   if (currentReceiveBank == AT91C_UDP_RX_DATA_BK0)
    currentReceiveBank = AT91C_UDP_RX_DATA_BK1;
   else
    currentReceiveBank = AT91C_UDP_RX_DATA_BK0;
  }
  AT91F_PIO_SetOutput(AT91C_BASE_PIOA, 2);  
 }
 pCdc->currentRcvBank = currentReceiveBank;
 return nbBytesRcv;
}
(4)主函数的实现代码如下,在主函数里主要完成USB设备的枚举、数据的收发等工作。在实现主函数时,读者需要注意的是:调试时无法在程序中设置断点,主要因为USB设备的枚举是个连续的过程,读者可以借助USB调试助手之类的工具来完成调试工作。
int main ( void )
{
 …// 变量声明
AT91C_BASE_RSTC->RSTC_RMR = AT91C_RSTC_URSTEN | (0x4<<8) | (unsigned int)(0xA5<<24);  
    // 初始化USB设备
    AT91F_USB_Open();
    // 等待USB枚举结束
while (!pCDC.IsConfigured(&pCDC));
while (1)
   {      
  length = pCDC.Read(&pCDC, data, MSG_SIZE);
    if (fir==0)
  {
      pCDC.Write(&pCDC, data,length);
      fir=1;
     }
  else
  {
     pCDC.Write(&pCDC, data,length);
      fir=0;
   }
 }
}
经过上面的步骤后,全速运行工程,并将USB连接线的A型插头,插入主机(通常为PC机),至于B型端接口,读者可以在板子上留出B型插座,也可以按前面描述的方法,将USB的4根信号线一一对应连接即可。此时,你将发现主机提示发现新设备,根据提示设置到atm6124ser.inf文件所在目录,安装完成后,通过选择我的电脑—属性—硬件—设备管理—调制解调器,将看到如图-2所示的结果。


   图2 USB虚拟串口


在图2中,我们看到在硬件设备管理中的调制解调器设备中多了一个设备,即:“ATMEL AT91 USB serial emulation”, 当然读者在实现过程中,可以修改atm6124ser.inf中的信息,以便更符合自己的应用需求。修改方法:在atm6124ser.inf文件中,找到下面的描述,修改成自己想定义的提示字符即可。
[Strings]
Mfg = "ATMEL CORPORATION"
AT91MSG = "ATMEL AT91 USB serial emulation"
USBFilterString ="AT91 USB serial emulation"
(5)通过上面的介绍,我们已经完成了USB虚拟串口的工作。下面简单描述测试方法:
在确定硬件连接无误后,并在程序中设置两标志位,即发数据前后各设一个标志位,程序运行后,通过串口调试助手软件,一次发送1024Bytes(1K Bytes)数据,并借助示波器观察两标志位状态变化时间,经过笔者测试,其数据传输率约为1K Bytes/ms,即与USB的全速状态下的数据传输率(12M bits/s)相吻合。

四、结语
至此,在AT91SAM7S256上通过CDC类实现USB虚拟串口的功能就介绍完毕,并经过笔者测试,文中所实现的USB虚拟串口的方法在实际的应用中是稳定的、可行的。

 

  推荐精品文章

·2024年12月目录 
·2024年11月目录 
·2024年10月目录 
·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089