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

sunzhil1987 2012-01-12 04:37:07
当从虚拟串口到真实串口发数据时,没有错误,但发送一个稍微大一点的文件时(如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);
}
}
望高手指教。
...全文
975 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunzhil1987 2012-01-16
  • 打赏
  • 举报
回复
而且这个例程都不能Debug,也不报任何错误提示,望高手指点。
sunzhil1987 2012-01-14
  • 打赏
  • 举报
回复
非常感谢啊!
woshi_ziyu 2012-01-14
  • 打赏
  • 举报
回复

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);
}
}

单次发送的数据太大了
分多次发送
sunzhil1987 2012-01-13
  • 打赏
  • 举报
回复
太感激了。
youzi722 2012-01-13
  • 打赏
  • 举报
回复
首先你的程序有问题,首先你的count_out应该是在USB收到数据是修改的吧,然后在main中判断,如果你在USB_To_USART_Send_Data()函数处理过程中又收到数据会改变count_out值,而退出后又将count_out改成0了,这肯定会丢数。建议你设计修改一下这个缓存转发机制。

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

解决办法:

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

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

(3). 增大STM32的RAM空间,大到可以缓存下你发送的最大文件,STM32收到后先缓存下来然后再从串口发
sunzhil1987 2012-01-12
  • 打赏
  • 举报
回复
自己先顶起来!望有人指点。
可能感兴趣的项目设计: USB虚拟串口的资料汇总(包括USB虚拟串口例程) (分享)USB 虚拟串口程序+PC驱动,亲测可用 串口调试在项目中被使用越来越多,串口资源的紧缺也变的尤为突出。很多本本人群,更是深有体会,不准备一个USB串口工具就没办法进行开发。本章节来简单概述STM32低端芯片上的USB虚拟串口的移植。在官方DEMO中已经提供了现成的程序,这里对修改方法做简单说明。 首先打开官方demo我们开始进行移植,第一步复制我们可用的文件,操作如下: Projects\Virtual_COM_Port文件夹下,复制红线部分 我为了方便演示统放在usb/src文件夹下: 现在复制USB的库文件,这些文件不需要我们修改: 上图中的文件统一放在usb/lib文件夹下: 好了现在所需要的文件我们以复制完了。这里先讲一下DEMO程序的主要工作流程: 由上图可知,PC通过虚拟串口发送数据到STM32 usb口,STM32再通过usart1发送数据到PC串口。我们做项目时,只用USB虚拟串口即可。所以我们现在需要把串口发送部分删除。把USB做为一个COM口来使用。我们要如何使用这个USB口呢?demo中是把USB发送数据做了一个缓存,先把要发送的数据存入缓存中,然后由USB自动发送出去。而接收部分是直接通过串口透传。我们在应用时就需要用到两个FIFO,1是发送,这个和demo方式是样;2是接收,接收也做一个缓存,我们通过查询来判断是否收到新数据。这下大家应该明白为什么使用两个FIFO了。 我这里有写好的FIFO库函数可直接使用Queue.c文件。 具体代码修改至附件内容下载。 官方demo+驱动程序截图:

27,373

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧