关于stm32 的 USB 转串口 virtual_Com_Port的例程的一些问题
2013-12-04 23:22
375 查看
当从虚拟串口到真实串口发数据时,没有错误,但发送一个稍微大一点的文件时(如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
其中:
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); } }
相关文章推荐
- MFC实现不规则形状窗口(CF登陆窗口)
- 国外经典设计:13个漂亮的插画网站设计案例
- 初涉Struts2---初识
- 长连接,长轮询
- 关于android的nfc问题 Ultralight c (通用卡)
- 关于-rpath可以指定路径来安装
- Eclipse中添加MyEclipse插件
- 实现程序集的延迟加载
- 读书笔记-重构-Pull Up Field(把属性移入父类)
- 详解EBS接口开发之库存事务处理-物料批次导入
- 详解EBS接口开发之库存事务处理-物料批次导入
- 详解EBS接口开发之库存事务处理-物料批次导入
- 进程的内存空间
- Castle.DynamicProxy Part 1: ClassProxy
- 读书笔记-重构-Form Template Method
- PLSQL程序编写杂烦数据表信息编写批量排版
- 安卓view.getMeasuredHeight()得到的高度单位以及dp和px的转换
- 电脑报2013年第3期
- 读书笔记-重构-Replace Method with Method Object(用对象代替方法)
- 解决Mysql错误:Can't create/write to file 'C:\WINDOWS\TEMP\#sql_1344_0.MYD' (Errcode: 17)