打印

STM32 USB 转串口 改进版本,实现文件发送

[复制链接]
5132|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
TRUE_ARM|  楼主 | 2011-7-5 13:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 TRUE_ARM 于 2011-7-14 21:06 编辑

专业信号处理学习板例程介绍.pdf (984.06 KB)


更改思路,使用队列来处理。


更改1
void USB_To_USART_Send_Data(u8* data_buffer, u8 Nb_bytes)
{
//polling ?
/* 原来官方的例程:这里使用查询的方式把USB 接收到的数据发送出去

u32 i;



for (i = 0; i < Nb_bytes; i++)


{


USART_SendData(USART1, *(data_buffer + i));


while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);


}
*/

//原来官方的例程,使用查询方式,效率低,
//int: 改进的处理:使用队列加缓冲加中断来处理USB 接收到的数据

Uart1SendPushBuf(data_buffer,
Nb_bytes);

}

更改2
void USART_To_USB_Send_Data(void)

//CALLED by int?

{//write data to END-point

//called by uart_rxe_int:



u16 i,j;



if (linecoding.datatype == 7)


{


//buffer_in[count_in] = USART_ReceiveData(USART1) & 0x7F;


usb_buf[usbIdIn] = USART_ReceiveData(USART1) & 0x7F;


}


else if (linecoding.datatype == 8)


{


//buffer_in[count_in] = USART_ReceiveData(USART1);


usb_buf[usbIdIn] =
USART_ReceiveData(USART1);


}



if(++usbIdIn>=2048)usbIdIn=0;


usb_len ++;



/*


count_in++;



UserToPMABufferCopy(buffer_in, ENDP1_TXADDR, count_in);


SetEPTxCount(ENDP1, count_in);


SetEPTxValid(ENDP1);


*/



//if usb -in_enp free now? start send?


if(
count_in == 0 )


{//free now? start send...


//j=(usb_len >= VIRTUAL_COM_PORT_DATA_SIZE)?VIRTUAL_COM_PORT_DATA_SIZE:usb_len;


if(usb_len > VIRTUAL_COM_PORT_DATA_SIZE)


{



j=VIRTUAL_COM_PORT_DATA_SIZE;



usb_len -=j;


}


else


{



j=usb_len;



usb_len =0;


}



for(i=0;i<j;i++)


{



buffer_in = usb_buf[usbIdOut];



if(++usbIdOut>=2048)usbIdOut=0;


}



count_in = j;



UserToPMABufferCopy(buffer_in, ENDP1_TXADDR, count_in);



SetEPTxCount(ENDP1, count_in);


SetEPTxValid(ENDP1);


}


//else just save to buffer,waiting usb-nak




  
}
沙发
yioy| | 2011-7-5 20:50 | 只看该作者
先下载看看

使用特权

评论回复
板凳
yioy| | 2011-7-5 20:50 | 只看该作者
不发表评论暂

使用特权

评论回复
地板
TRUE_ARM|  楼主 | 2011-7-5 22:00 | 只看该作者
注意:
主循环部分:

while (1)
  {
  /*
    if ((count_out != 0) && (bDeviceState == CONFIGURED))
    {
      if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8))
      { //PB.8
        GPIO_ResetBits(GPIOB, GPIO_Pin_9);
        GPIO_ResetBits(GPIOB, GPIO_Pin_8);
        GPIO_ResetBits(GPIOB, GPIO_Pin_7);
      }
      else{
        GPIO_SetBits(GPIOB, GPIO_Pin_9);
        GPIO_SetBits(GPIOB, GPIO_Pin_8);
        GPIO_SetBits(GPIOB, GPIO_Pin_7);
      }
      //接收USB 的数据,分析
      USB_To_USART_Send_Data(&buffer_out[0], count_out);
      count_out = 0;
      
      //Add send to PC using USB:write ENP:
      
      //---------------------------------------------
    }*/

//端点中断:
void EP3_OUT_Callback(void)
{
/*
  count_out = GetEPRxCount(ENDP3);
  PMAToUserBufferCopy(buffer_out, ENDP3_RXADDR, count_out);
  SetEPRxValid(ENDP3);
  */
  //--->
  /*
在用串口调试助手debug时发现官方例程的接收完全没问题,发送部分有很大问题,当发送的数据很大时就会出现很严重的丢包.
后来我将EP3_OUT_Callback函数改成下面的,将main函数里的USB_To_USART_Send_Data注释掉就OK了,分析了一下,觉得问题可能
是当发送大量数据时main函数的USB_To_USART_Send_Data还没处理完,后面的数据就过来了,将buffer_out里面的数据覆盖掉了.
当我将USB_To_USART_Send_Data移到EP3_OUT_Callback后,只有当前数据处理完才会允许下一次传输.修改后的例程我试过通过
com口给别的板子升级firmware完全没问题.
  */
  count_out = GetEPRxCount(ENDP3);
  PMAToUserBufferCopy(buffer_out, ENDP3_RXADDR, count_out);
//这里把数据处理完毕,再允许端口3
  USB_To_USART_Send_Data(&buffer_out[0], count_out);
  count_out = 0;
  SetEPRxValid(ENDP3);
}

使用特权

评论回复
5
TRUE_ARM|  楼主 | 2011-7-14 09:02 | 只看该作者
Virtual_COM_Port_Profession.rar (1.87 MB)

完整工程上传。

使用特权

评论回复
6
xsgy123| | 2011-7-14 10:02 | 只看该作者
先分析一下,楼主还是很有想法的

使用特权

评论回复
7
wowewo| | 2011-7-14 14:10 | 只看该作者
下载看看

使用特权

评论回复
8
火箭球迷| | 2011-7-14 15:11 | 只看该作者
楼主的确是很有想法,鼓励多思考

使用特权

评论回复
9
TRUE_ARM|  楼主 | 2011-7-28 22:09 | 只看该作者
好像建议不多啊?

使用特权

评论回复
10
zzwj5120| | 2011-8-21 16:28 | 只看该作者
这个版本,连发数据不行的,找个200K的文件自发自收测试下就知道了。

使用特权

评论回复
11
wucs1| | 2012-9-10 10:27 | 只看该作者
试试看。

使用特权

评论回复
12
pjdu| | 2012-9-13 10:26 | 只看该作者
试试看。。。

使用特权

评论回复
13
pjdu| | 2012-9-13 10:26 | 只看该作者
试试看。。。

使用特权

评论回复
14
pjdu| | 2012-9-13 10:27 | 只看该作者
试试看。。。

使用特权

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

本版积分规则

124

主题

454

帖子

1

粉丝