新手入门
- 积分
- 18
- 金钱
- 18
- 注册时间
- 2016-5-24
- 在线时间
- 5 小时
|
15金钱
本帖最后由 HAOHAO 于 2018-7-31 16:13 编辑
是这样的,串口1大概每1秒接受一个300字节的包,串口2每40毫秒接受一个270字节的包,波特率设置的是57600(115200丢包现象会减少很多,但是要求不能只能57600及以下。)
下面是我的串口中断服务函数代码,求大神帮忙看看。(串口1,串口2 单独工作时无丢包现象,串口1,2同时工作时丢包率3%左右。)
串口1使用DMA存下来,收到一帧结束后用空闲中断让U3_TX发送,串口2在串口1发送时将数据存下来、再发送,串口1未发送时,串口2服务函数中直接让U3_T发送。
串口配置的代码就不上传了,下面是我串口1、2的中断服务函数代码
void USART1_IRQHandler(void) //′®¿ú1ÖD¶Ï·tÎñ3ìDò
{
#ifdef OS_TICKS_PER_SEC //èç1ûê±Öó½úÅÄêy¶¨òåáË,ËμÃ÷òaê1óÃucosIIáË.
OSIntEnter();
#endif
if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET) //½óêÕÖD¶Ï
{
mark1=1;
USART_ReceiveData(USART1);
Usart1_Rec_Cnt = DMA_Rec_Len-DMA_GetCurrDataCounter(DMA1_Channel5);
Usart3_Send(DMA_Rece_Buf,Usart1_Rec_Cnt);
USART_ClearITPendingBit(USART1, USART_IT_IDLE);
DMA1->IFCR|=1<<13;//Çå3yí¨μà4′«êäíê3é±êÖ¾
MYDMA_Enable(DMA1_Channel5); //»Ö¸′DMAÖ¸Õ룬μè′yÏÂò»′ÎμĽóêÕ
mark1=0;
}
#ifdef OS_TICKS_PER_SEC //èç1ûê±Öó½úÅÄêy¶¨òåáË,ËμÃ÷òaê1óÃucosIIáË.
OSIntExit();
#endif
}
void USART2_IRQHandler(void) //′®¿ú2ÖD¶Ï·tÎñ3ìDò //èç1ûflag=1£¬¾í′æÆeà′£¬èç1ûfLag=0,¾íᢿ췢Ëí¡£
{ u8 i;
if(USART_GetFlagStatus(USART2,USART_IT_RXNE)!=RESET)//??PC???
{ // USART2->SR;
if(mark1==1)
{
USART_RX_BUF[USART_RX_STA]=USART_ReceiveData(USART2);
USART_RX_STA++;
}
else
{
if(USART_RX_STA==0)
{
USART_SendData(USART3, USART_ReceiveData(USART2));
while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
}
else
{
for(i=0;i< USART_RX_STA;i++) { USART_SendData(USART3,USART_RX_BUF); while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET); }
USART_RX_STA=0;
}
}
}
}
|
最佳答案
查看完整内容[请看2#楼]
57600的波特率,1ms接收5.76个字符,40ms可以接收最多230个字符左右。 所以你要40ms收270个字符,原理上就不行了。。。。
|