打印

香水城 STM32 USB转串口 9位数据的问题

[复制链接]
2811|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
code|  楼主 | 2013-8-2 14:07 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
我使用ST官方的4.0库 Virtual_COM_Port例子
电脑通虚拟串口给USB设备发送数据
仅仅传递8位数据而已,第9位也没有传递过来的啊!!!  怎么办??

//这个是USB往串口COM1发送数据的函数
如何获得第9位啊!!  谢谢!!!!!!!!!!
如下面的程序代码
Nb_bytes=数据字节数量
uint8_t* data_buffer=8位数据的开始地址

我说的电脑发送USB没有9位数据
不是串口发送出去没有9位数据
再次谢谢

void USB_To_USART_Send_Data(uint8_t* data_buffer, uint8_t Nb_bytes)
{
  
  uint32_t i;
  loops=0x3ffff;
  
  for (i = 0; i < Nb_bytes; i++)
  {
    USART_SendData(EVAL_COM1, *(data_buffer + i));
    while(USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TXE) == RESET);
  }  
}

沙发
airwill| | 2013-8-2 15:17 | 只看该作者
uint8_t* data_buffer=8位数据的开始地址

这是个 8位数据的缓冲区. 估计保存进这个缓冲的时候, 高位就被丢弃了. 可以用调试器跟踪看看

使用特权

评论回复
板凳
code|  楼主 | 2013-8-3 09:34 | 只看该作者
void EP3_OUT_Callback(void)
{
  uint16_t USB_Rx_Cnt;
  
  /* Get the received data buffer and update the counter */
  USB_Rx_Cnt = USB_SIL_Read(EP3_OUT, USB_Rx_Buffer);
  
  /* USB data will be immediately processed, this allow next USB traffic being
  NAKed till the end of the USART Xfer */
  
  USB_To_USART_Send_Data(USB_Rx_Buffer, USB_Rx_Cnt);

  /* Enable the receive of data on EP3 */
  SetEPRxValid(ENDP3);
}

继续寻找是谁调用  USB_To_USART_Send_Data(,)函数
原来是void EP3_OUT_Callback(void)调用USB_To_USART_Send_Data(,)函数

uint8_t USB_Rx_Buffer[VIRTUAL_COM_PORT_DATA_SIZE];
USB_SIL_Read()函数把EP3_OUT缓冲区的复制到uint8_t USB_Rx_Buffer数组里面
无9位的数据的啊 !!!
我在本版面,实在是找不到答案啊 !!!!
搜索本版面9位,得到的答案是关于USART的9位
搜索本版面的USB转串口,讨论的是其他的问题
请帮忙拉


使用特权

评论回复
地板
airwill| | 2013-8-3 11:01 | 只看该作者
我说的电脑发送USB没有9位数据?   PC 端的串口函数里, 最长的数据长度是 8. 但是第9 位数据可以通过校验位发送. 用强制0或1的校验位方式, 就可以发送第9位了.

但是 STM32 的 usb 库里是不是支持这个还不好说, 我没有分析过这个问题, 楼主仔细分析一下吧

使用特权

评论回复
5
code|  楼主 | 2013-8-5 09:06 | 只看该作者
我也在怀疑是不是ST的驱动不支持这个9未位方式

使用特权

评论回复
6
john_lee| | 2013-8-5 10:02 | 只看该作者
电脑上的COM设备能收发的最小数据单位就是字节了,USB也是一样,不关ST什么事。

使用特权

评论回复
7
code|  楼主 | 2013-8-5 10:20 | 只看该作者
电脑上的COM设备能收发的最小数据单位就是字节了,
(你这句话错了,COM设备能收发的最小数据单位可以是9位,也可以是7位,不再是完整的一个字节了)

虽然USB的最少传输单位是一个字节
但是也可以额外使用一个字节的bit0来作为第9位
并且忽略掉bit1-bit7


另外,再看如下USART的发送函数
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)
{
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  assert_param(IS_USART_DATA(Data));
   
  /* Transmit Data */
  USARTx->DR = (Data & (uint16_t)0x01FF);
}

//这里与运算0x1ff , 可以看见是9位数据

使用特权

评论回复
8
code|  楼主 | 2013-8-5 15:25 | 只看该作者
:)

使用特权

评论回复
9
7120223| | 2013-8-5 17:12 | 只看该作者
有人吧这个虚拟串口用在产品中么?
之前我用官方库也调试过一段时间,当上位机快速的频繁和COM通讯的时候会漏数据,缓存当时开已经很大了。还有就是偶尔的死机现象,只能通过重新拔插,应该是电脑干扰了单片机了,试过一些改良,还是没成功。

使用特权

评论回复
10
cjhk| | 2013-8-5 18:51 | 只看该作者
电源那边  有没有仔细看看   也可能有问题   楼主  

使用特权

评论回复
11
code|  楼主 | 2013-8-6 16:56 | 只看该作者
:)

使用特权

评论回复
12
code|  楼主 | 2013-8-7 11:29 | 只看该作者
:)

使用特权

评论回复
13
zzwj5120| | 2013-8-8 09:00 | 只看该作者
ST的4.0版本例程也不是产品级的代码,死机问题没有解决。

使用特权

评论回复
14
code|  楼主 | 2013-10-28 15:36 | 只看该作者

使用特权

评论回复
15
香水城| | 2013-11-4 21:11 | 只看该作者
zzwj5120 发表于 2013-8-8 09:00
ST的4.0版本例程也不是产品级的代码,死机问题没有解决。

什么死机问题?可否详述?

4.0版本哪个demo,在何种情况下死机?

使用特权

评论回复
16
香水城| | 2013-11-4 21:36 | 只看该作者
code 发表于 2013-8-5 09:06
我也在怀疑是不是ST的驱动不支持这个9未位方式

第一,STM32F1 MCU本身肯定没有硬件上的限制说不能接收9位数据

第二,对应USB CDC device demo里,对收到的9位数据的处理应该如下:

假设PC上位机的串口应用发送1个9位数据,CDC driver应该把它以两个字节的形式通过USB发送下来,由此触发EP3_OUT_Callback()。在该函数里,从USB硬件buf中把收到的数据读取出来。因此这里USB_Rx_Cnt应该为2,然后USB_Rx_Buffer中前两个元素被赋值。

接着在USB_To_USART_Send_Data()里,应该判断如果是9位数据帧的话,把USB_RX_Buffer[0]和[1]的最低位组合成9位数据赋值给USARTx->DR。

使用特权

评论回复
17
香水城| | 2013-11-4 21:40 | 只看该作者
另外查阅了一下CDC规范,显示说明CDC支持的数据帧长度有以下几种,未见9位数据帧在支持范围中?

使用特权

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

本版积分规则

个人签名:"></a><img src="http://uc2.21ic.com/avatar.php?uid=319240&size=middle"></img><a href="

40

主题

150

帖子

1

粉丝