打印
[应用相关]

请教虚拟串口程序解释

[复制链接]
4648|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mcuatmel|  楼主 | 2014-4-9 08:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问这句怎么理解:
__ALIGN_BEGIN uint8_t APP_Rx_Buffer   [APP_RX_DATA_SIZE] __ALIGN_END ;



沙发
airwill| | 2014-4-9 10:56 | 只看该作者
是不是对 __ALIGN_BEGIN,  __ALIGN_END 犯疑惑呢?
其实这些只是个宏而已, 告诉编译器地址对齐的.
楼主可以查一下定义.

使用特权

评论回复
板凳
mcuatmel|  楼主 | 2014-4-9 11:02 | 只看该作者
我查了,感觉上是,但不敢确定。
另外还有,这个USB虚拟串口是怎么发送的呢?
static uint16_t VCP_DataTx (uint8_t* Buf, uint32_t Len)
{
  if (linecoding.datatype == 7)
  {
    APP_Rx_Buffer[APP_Rx_ptr_in] = USART_ReceiveData(EVAL_COM1) & 0x7F;
  }
  else if (linecoding.datatype == 8)
  {
    APP_Rx_Buffer[APP_Rx_ptr_in] = USART_ReceiveData(EVAL_COM1);
  }
  
  APP_Rx_ptr_in++;
  
  /* To avoid buffer overflow */
  if(APP_Rx_ptr_in == APP_RX_DATA_SIZE)
  {
    APP_Rx_ptr_in = 0;
  }  
  
  return USBD_OK;
}

调用时这么写:
VCP_DataTx (0,0);
是怎么工作的?

使用特权

评论回复
地板
yang4469| | 2014-4-9 11:15 | 只看该作者
mcuatmel 发表于 2014-4-9 11:02
我查了,感觉上是,但不敢确定。
另外还有,这个USB虚拟串口是怎么发送的呢?
static uint16_t VCP_DataTx  ...

这个函数只是改变APP_Rx_ptr_in的值,USB发送数据是在一个Handle_USBAsynchXfer的函数里面,这个函数是在连上USB后会一致响应的一个中断函数,根据APP_Rx_ptr_in来确定发送数据的个数,以及在发送数组中的位置

使用特权

评论回复
5
香水城| | 2014-4-9 12:19 | 只看该作者
VCP_DataTx (0,0);就是以中断方式接收来自USART的数据,然后放到全局数组APP_Rx_Buffer[]中

但是在usbd_cdc_DataIn()Handle_USBAsynchXfer()两个函数中,才是处理APP_Rx_Buffer[]中的哪些数据将通过CDC_IN_EP发送给PC上位机:

DCD_EP_Tx (pdev,
               CDC_IN_EP,
               (uint8_t*)&APP_Rx_Buffer[USB_Tx_ptr],
               USB_Tx_length);

使用特权

评论回复
6
mcuatmel|  楼主 | 2014-4-9 16:06 | 只看该作者
请问香主:我想提高这个通讯的速度,得怎么改才行,我试了下,初步能实现通讯,可以做到4M bps,再高不好用了,我想做到60M bps,不知能否实现。

使用特权

评论回复
7
yang4469| | 2014-6-17 17:29 | 只看该作者
mcuatmel 发表于 2014-4-9 16:06
请问香主:我想提高这个通讯的速度,得怎么改才行,我试了下,初步能实现通讯,可以做到4M bps,再高不好用 ...

USB全速才12M,你只有改为高速模式,硬件需要调整

使用特权

评论回复
8
想做大牛的小马| | 2014-6-17 17:37 | 只看该作者
说的真好~

使用特权

评论回复
9
juanhao| | 2014-7-18 16:39 | 只看该作者
香主:请问VCP例子中用到STM32的USB和UART2,请问我的虚拟串口程序不占用任何UART的端口可以吗?就是用USB来做串口。

使用特权

评论回复
10
juanhao| | 2014-7-18 16:41 | 只看该作者
1:VCP的例子中是接收PC端的USB数据通过UART2的TX发出去,RX接收到再通过USB发回电脑,是吧?
2:我的程序中不用UART一样也可以实现虚拟串口吧,比较弱,请海涵!

使用特权

评论回复
11
STARM| | 2014-7-18 17:59 | 只看该作者
>> 我的程序中不用UART一样也可以实现虚拟串口吧

可以, 但是 USB 接口是必须的

使用特权

评论回复
12
wtch519361| | 2014-11-28 15:22 | 只看该作者
直接修改usbd_cdc_vcp()文件中例程可以实现串口收发吗?如VCP_DataTx(temp,10),temp是自己定义的数组,好像不行嘛
static uint16_t VCP_DataTx (uint8_t* Buf, uint32_t Len)
{
  if (linecoding.datatype == 7)
  {
    APP_Rx_Buffer[APP_Rx_ptr_in] = USART_ReceiveData(EVAL_COM1) & 0x7F;
  }
  else if (linecoding.datatype == 8)
  {
    APP_Rx_Buffer[APP_Rx_ptr_in] = USART_ReceiveData(EVAL_COM1);
  }
  
  APP_Rx_ptr_in++;
  
  /* To avoid buffer overflow */
  if(APP_Rx_ptr_in == APP_RX_DATA_SIZE)
  {
    APP_Rx_ptr_in = 0;
  }  
  
  return USBD_OK;
}

使用特权

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

本版积分规则

512

主题

1456

帖子

2

粉丝