关于stm32 的 USB 转串口 virtual_Com_Port的例程的一些问题

发布者:冷漠之心最新更新时间:2016-12-23 来源: 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的例程的一些问题

上一篇:ARM启动代码中的断言伪指令ASSERT
下一篇:STM32之USART配置

推荐阅读最新更新时间:2024-03-16 15:26

再造STM32---第一部分:如何正规的安装KEIL5?
获取本文所有安装包和注册机方式: 1、CSDN下载: https://download.csdn.net/download/qq_38351824/10943718 2、可以关注点赞并在下方评论,我给你邮箱发过去。 3、关注微信公众号下载: ① 关注微信公众号:Tech云 ② 一、温馨提示: 1、 安装路径不能带中文,必须是英文路径 2、 安装目录不能跟 51 的 KEIL 或者 KEIL4 冲突,三者目录必须分开 3、 KEIL5 的安装比起 KEIL4 多了一个步骤,必须添加 MCU 库,不然没法使用。 4、 如果使用的时候出现莫名其妙的错误,先百度查找解决方法,莫乱阵脚。 二、获取 KEIL5
[单片机]
再造STM32---第一部分:如何正规的安装KEIL5?
关于STM32 NVIC配置的解释
大部分学习用的开发板在配置各个外设的中断优先级时,习惯在每个外设的初始化文件里都进行NVIC group配置,例如在ADC和Usart都有NVIC的配置如下: ADC中: void ADC_NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); NVIC_InitStructure.NVIC_IRQChannel =ADC1_2_IRQn; //开启ADC_Channel8中断 NVIC_InitStructure.NVIC_IRQChannelPree
[单片机]
STM32——使用PWM+DMA实现脉冲发送精确控制
之前用stm32写过脉冲发送的代码,用来控制步进电机,但是缺点明显,之前是用定时器中断做的,所以一但控制的电机多起来,MCU资源占用就很大,这在大多数情况下是不可接受的,更不用说多轴联动了。 最近做的步进电机CAN总线控制系统,就想顺便重新写驱动。希望做到占用很少的MCU资源,实现脉冲发送的精确控制。既然是用来控制步进电机,那么脉冲的数量和频率一定要可控,要不然怎么实现电机的加减速曲线。于是就想到了DMA。 DMA (直接存储器访问) DMA(Direct Memory Access,直接内存存取) 是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载。否则,CPU 需要从来源把每一
[单片机]
<font color='red'>STM32</font>——使用PWM+DMA实现脉冲发送精确控制
USB/IrDA桥控制芯片STIr4200S
    摘要: 从功能方块图、引脚说明、帧格式、寄存器及其控制指令等几个方面详细介绍SigmaTel公司开发的一款专用于USB与IrDA间桥接控制的新型ASIC:STIr4200S。     关键词: 红外无线数据通信 USB IrDA STIr4200S STIr4200S是SigmaTel公司开发的一款专用于USB与IrDA间桥接控制的新型ASIC,采用低功耗CMOS设计,直接从USB口馈电,片内集成4K字节的FIFO缓冲,采用28脚SSOP封装,IrDA数据传输率范围从2.4 Kbps到4 Mbps,主要用于通过USB口实现红外无线数据通信。 1 功能方块图    功能
[网络通信]
STM32独立看门狗:你看狗都独立了
STM32--软看门口--不需要任何硬件支持--它在IC里面已经集成了。(算是独立看门狗的误解吧) 一个倒计数,减减减减减减,减到0就会触发一个系统复位信号也就是单片机重启了。 喂狗呢?就是隔一段时间就给这个倒计数重现装载数据,保持它不要到0. 头文件: #ifndef _WDG_H_ #define _WDG_H_ void watch_dog_init(void); void feed_dog(void); #endif 实现: #include stm32f10x_iwdg.h #include wdg.h void watch_dog_init(void) { IWDG_WriteAc
[单片机]
基于S3C6410的ARM11学习(十七) 串口走起来
串口,可说是嵌入式开发中重要的开发工具了。通过串口,我们可以和开发板进行交互,同时也可以打印芯片内部的一些信息。 ARM11的串口使用也是比较简单的。当然首先需要配置一下。 以上是串口驱动开发的流程。首先对串口进行初始化,然后实现发送和接收。 以上是串口的结构图。对于接收和发送,都有一个64字节大小的FIFO。对于发送来说,如果使用FIFO的话,如果FIFO没有满,那么发送的数据首先发送到FIFO中,然后FIFO中的数据会自动的发送到发送移位寄存器中通过串口发送出去。接收也是一样的道理。 简单的使用就是不使用FIFO。数据直接发送到发送移位寄存器中发送。 下面就开始串口程序的设计了, 一
[单片机]
基于S3C6410的ARM11学习(十七) <font color='red'>串口</font>走起来
STM32 usb_core.c分析
usb_core.c这个c文件是个庞大的文件,主要是定义了usb2.0的标注协议处理函数。 下面是这个文件的所有函数: /******************************************************************************* * Function Name : Standard_GetConfiguration. * Description : 返回当前配置变量的地址 * Input : Length -需要的字节 How many bytes are needed. * Output : None. * Return : 如果'Length
[单片机]
keil c51 串口调试
/* Keil c51 平台模拟调试c51串口程序,能在keil c51串行窗 口上观察到程序运行结果,并能在pc机键盘上输入参数,c51提供一些标准串行输入输出 函数。在调用输入输出函数时,用户程序必须对串行口初始化为通信方式(且TI=1),并 且在文件开头有颈处理命令:#incLude stdio.h */ #include reg52.h #include stdio.h #define uchar unsigned char #define uint unsigned int init_sys() { SCON=0x52; // 串口工作方式1, 允许接收,TI=1; TMOD=0x20; //T1
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved