打印

stm32 usb虚拟串口 程序问题的讨论

[复制链接]
7268|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
txcy|  楼主 | 2009-8-21 21:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
近几天 调试usb虚拟串口的程序,发现一些问题以及解决方法。和大家共享
主要问题是  串口有时收到乱码 有时收到丢包数据:
  关于 乱码 我们其实很容易想到 奇偶校验的问题,而我们平常都是默认为没有奇偶校验。
    请看程序:
         * USART1 default configuration */
  /* USART1 configured as follow:
        - BaudRate = 9600 baud   
        - Word Length = 8 Bits
        - One Stop Bit
        - Parity Odd
        - Hardware flow control desabled
        - Receive and transmit enabled
        - USART Clock disabled
        - USART CPOL: Clock is active low
        - USART CPHA: Data is captured on the second edge  
        - USART LastBit: The clock pulse of the last data bit is not output to  
                         the SCLK pin
  */
  USART_InitStructure.USART_BaudRate = 9600;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_Odd;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  USART_InitStructure.USART_Clock = USART_Clock_Disable;
  USART_InitStructure.USART_CPOL = USART_CPOL_Low;
  USART_InitStructure.USART_CPHA = USART_CPHA_2Edge;
  USART_InitStructure.USART_LastBit = USART_LastBit_Disable;

只要改成odd  或者程序里作修改即可
  

问题2 :既然是虚拟串口,那么利用pc串口软件 两边应该可以正常通信,但是源程序出现的情况是。
         真--虚  ok  
             虚--真  则严重丢数据

  看了一下程序  原来捣鬼的是这里:
      void USB_To_USART_Send_Data(u8* data_buffer, u8 Nb_bytes)
{
  u32 i;

  for (i = 0; i < Nb_bytes; i++)
  {
    USART_SendData(USART1, *(data_buffer + i));
       }
}
串口发送数据后 没有等待串口发送完成

改为下边即可
   void USB_To_USART_Send_Data(u8* data_buffer, u8 Nb_bytes)
{
  u32 i;

  for (i = 0; i < Nb_bytes; i++)
  {
    USART_SendData(USART1, *(data_buffer + i));
      while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
   
  }
}
沙发
mcuisp| | 2009-8-21 22:14 | 只看该作者
ST提供的是一个Demo。
要实用,得重新整一套架构。

使用特权

评论回复
板凳
heyuanpi| | 2011-10-20 15:59 | 只看该作者
嗯 就是这个

使用特权

评论回复
地板
香水城| | 2011-10-20 16:27 | 只看该作者
鼓励经验共享!

使用特权

评论回复
5
火箭球迷| | 2011-10-20 19:00 | 只看该作者
很有用的一些经验

使用特权

评论回复
6
baidudz| | 2011-10-20 19:34 | 只看该作者
经验共享,值得表扬

使用特权

评论回复
7
网络转接| | 2011-10-20 20:48 | 只看该作者
这不是我写的吗 怎么楼主  转为自己的了

使用特权

评论回复
8
网络转接| | 2011-10-20 20:49 | 只看该作者
这个只是1.0版本出现的问题 后面st已经更正了

使用特权

评论回复
9
xiejun219| | 2011-11-30 09:59 | 只看该作者
请问一下  相对于问题2   我是用的是正点原子的板子  然后没有真实串口  是一个 USB转串口和一个USB虚拟串口通信   虚拟串口给USB转串口发送数据的时候  可以全部正确收到  但是  USB转串口给虚拟串口发送数据的时候  数据丢失非常严重   
请问是什么情况
可以把解决方案发送到我的email么  xiejun219@163.com  谢谢

使用特权

评论回复
10
mo_yu| | 2013-1-29 16:28 | 只看该作者
不错

使用特权

评论回复
11
kensou2k| | 2013-6-14 15:41 | 只看该作者
好经验,感谢楼主分享。。。

另外,这里面的void USB_To_USART_Send_Data()函数只能让usb和usart1通讯吧?

如果要加入usart2是否要重新编写一个函数?

使用特权

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

本版积分规则

274

主题

2106

帖子

0

粉丝