历史上的今天

今天是:2024年10月19日(星期六)

正在发生

2020年10月19日 | 关于stm32 的 USB 转串口 virtual_Com_Port的例程的一些问题

发布者:喜悦的38号 来源: eefocus关键字:stm32  USB  转串口  virtual_Com_Port 手机看文章 扫描二维码
随时随地手机看文章

当从虚拟串口到真实串口发数据时,没有错误,但发送一个稍微大一点的文件时(如1M),误码率很高。不知是为什么?  
其中:  
int main(void)  
{  

#ifdef DEBUG  
  debug();  
#endif  
    
  Set_System();  
  Set_USBClock();  
  USB_Interrupts_Config();  
  USB_Init();  
    
  while (1)  
  {  
  if (count_out != 0)  
  {  
  USB_To_USART_Send_Data(&buffer_out[0], count_out);//这句是发数据的函数,原型如下。  
  count_out = 0;  
  }  
  }  
}  
其中:  
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);   
  }  
}  
望高手指教。


------解决方案--------------------
首先你的程序有问题,首先你的count_out应该是在USB收到数据是修改的吧,然后在main中判断,如果你在USB_To_USART_Send_Data()函数处理过程中又收到数据会改变count_out值,而退出后又将count_out改成0了,这肯定会丢数。建议你设计修改一下这个缓存转发机制。

另外虚拟串口发数据发的太快了,发送大数据量时实际串口发不过来了。打开虚拟串口时的参数限制不了USB端的虚拟串口的速度,这个参数只是传给STM32让STM32设置实际串口参数用的。

解决办法:

(1). 自己写USB转串口的驱动,在驱动发送数据的代码中限制发送速度。

(2). 自己写上位机的串口发送程序,加上协议,建立发送应答机制,保证数据发送成功。

(3). 增大STM32的RAM空间,大到可以缓存下你发送的最大文件,STM32收到后先缓存下来然后再从串口发 
------解决方案--------------------

  • C/C++ code
  • 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);   
      }  
    }


关键字:stm32  USB  转串口  virtual_Com_Port 引用地址:关于stm32 的 USB 转串口 virtual_Com_Port的例程的一些问题

上一篇:stm32 GPIO配置以及什么时候用 GPIO_InitStructure
下一篇:STM32串口DMA超时接收方法,可大大节约CPU时间

推荐阅读

        据Digital Trends报道,本周的Mate20系列伦敦发布活动期间,华为消费者业务CEO余承东在与少数几家国际媒体交流时谈到了它们的5G手机。  余承东表示“我们正在打造可折叠手机,(且是)可折叠的5G手机”。  事实上,9月份的世界经济论坛上,华为轮值主席胡厚崑就首次表示,其首款支持5G的Android智能手机也将配备可折叠显示屏,该机将...
随着电子产品功能性的多样化,产品对电源种类也越来越多了。车载信息系统产品电源一般是是由外界提供 12V 电源输入,通过各种 LD0 和 DC-DC 电源芯片转化供给各功能模块使用。其中,LD0 电源芯片虽然有其占用面积小,成本低,稳定性好,低噪声等多方优点,但由于受限于输入输出电压差不能太大影响,一般选择用于电源降压转换。而开关电源芯片因其效...
10月22日,华为就要正式在线上发布Mate 40系列了,届时一同亮相的还会有麒麟9000处理器,其跟苹果A14一样,都是基于台积电的5nm工艺制程。  现在,网上再次出现了Mate 40 Pro的新图片,跟之前不一样的是,这次是新机的新配色,看起来非常骚气,因为是亮橙色,整机在这个新配色加持下非常的抢眼。  从图片上也可以看出,Mate 40 Pro背部的...
电气和电子工程师协会(IEEE,全称是Institute of Electrical and Electronics Engineers)是一个美国的电子技术与信息科学工程师的协会,是世界上最大的非营利性专业技术学会,其会员人数超过40万人,遍布160多个国家。IEEE致力于电气、电子、计算机工程和与科学有关的领域的开发和研究,在航空航天、信息技术、电力及消费性电子产品等领域 已制定了9...

史海拾趣

问答坊 | AI 解惑

花1万元的PCB设计高级讲座 -- PCB设计讲义.pdf

花1万元的PCB设计高级讲座 -- PCB设计讲义.pdf  …

查看全部问答∨

阜阳法院如此判案,错!错!错!

阜阳法院如此判案,错!错!错! 我公司无辜受害,冤!冤!冤! 长春建工集团有限公司印章被伪造,假冒的分公司招摇撞骗,虽然假冒分公司已被工商管理机关撤销,此事已向公安机关报案,但就是这样一个假冒分公司非法经营活动所产生的经济纠纷,却 ...…

查看全部问答∨

单片机键盘驱动

大家对这个程序发表意见:: 中断程序功能:将键盘输入的数字存储到单片机数据存储器的某个位置:勇于接受批评,INIT1: S1:MOV DPTR ,#3FFFH    MOV A,@DPTR    MOV R2,A    LJMP DELAY1ms    MOVX ...…

查看全部问答∨

i2c发数据,首地址变了,SyncIst和I2C_IST的不解??

我调用deviceiocontrol向外部i2c设备发送数据,系统在底层调用I2C_IoControl; I2C_IoControl调用HW_Write函数,在对语句if (WAIT_OBJECT_0 != SyncIst(pI2C, TX_TIMEOUT))进行判断时,转跳SyncIst函数; 在SyncIst函数运行到WaitForSingleObject ...…

查看全部问答∨

如何在汇编语言中定义long型变量?

如何在汇编语言中定义long型变量? 看了一些示例程序,在程序中定义变量时一般直接定义为通用寄存器,因为我得程序用到的变量较多,打算在ram里面定义几个long型变量,找了一些资料很少看到在ram中定义变量的。 刚开始学习用汇编写,希望高人回答 ...…

查看全部问答∨

重塑企业 DNA,英特尔即将进军电视服务

本帖最后由 jameswangsynnex 于 2015-3-3 20:05 编辑 …

查看全部问答∨

ADI产品介绍及其在各个领域中的应用

ADI专家面对面是ADI公司与广大中小型客户以研讨会和客户拜访的形式直接交流的活动。ADI技术专家现场指导客户如何应对实际设计应用中面临的问题,并详细讲解了用户在实际应用中遇到的常见问题和解决方法。 应广大客户的要求,我们将陆续上传ADI资深 ...…

查看全部问答∨

单轴倾角传感器SCA60C团购贴(针对EEW比赛的朋友)

本帖最后由 paulhyde 于 2014-9-15 03:02 编辑 针对EEW参加比赛的朋友,一直想做点事,但都没有行动。 最近看到SCA60C的小量采购量大量上升,估计很多朋友都在用这个准备比赛。所以特在这发个贴,给EEW的朋友特价支持! 有需要这个倾角传感器的 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved