串口1接收到数据转发到串口2,串口2接收到数据转发到串口1

2019-07-20 17:53发布

本帖最后由 ssssssssssss 于 2016-12-15 20:22 编辑

我想实现: 串口同步转发                串口1接收到数据转发到串口2,串口2接收到数据转发到串口1,
            具体是这样的,串口2控制着一个蓝牙模块,但是我想用串口1来配置蓝牙模块,考虑到速度,我希望串口2接收到数据串口1可以立马发出来,串口1接收到数据串口2可以立马发出去,最好没有时间间隔,可以实现吗?           我实验了一下,采用dma转发会有丢数据和乱码的情况出现,比如发送20个字节可能会有三四个数据漏发或者错误!请问大神们有办法吗?
void USART1_IRQHandler(void)
{        


        if(USART1->SR&BIT5)                                                        //接收到数据
        {        
            USART1_NUM++;           
        //        UsartRx(USART1->DR);
           // DMAbuffer1[0]=USART1->DR;        
                if((DMA1->ISR&(1<<25)))
                {
                    USART2DMA_Enable(DMA1_Channel7,1);
               
                }                 
                USART1->SR &= ~BIT5;               
        }               
}



void USART2_IRQHandler(void)
{//        

         
        if(USART2->SR&BIT5)                                                        //接收到数据
        {        
                   USART2_NUM++;
        //        DMAbuffer1[0]=USART2->DR;
        
                if((DMA1->ISR&(1<<13)))
                {               
                      DMA1_MEM_LEN=1;                                //清除通道4传输完成标志
               MYDMA_Enable(DMA1_Channel4);
        
                }

            USART2->SR &= ~BIT5;
        
         //  usart2TxLen++;
         //  GetSPace=0;
        }
}




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
15条回答
ssssssssssss
1楼-- · 2019-07-22 04:02
yaxeff 发表于 2016-12-20 22:01
以上是直接转发的代码,当然没有其他处理,就蓝牙那点数据量完全可行.
而如果你一定要使用DMA接收的话需要 ...

我只是采用了dma发送,我的试验结果如下:
当pc给串口1发送:
abcdefghigklmnopqrstuvwxyzabcdefghigklmnopqrstuvwxyz
串口2接收到并且发送出来的数据为:
abcdefghigklmnopqrstuwxyzabcdefhigklmnopqstuvwxyz
abcdefghigklmnopqrstuwxyzabcdefhigklmnopqstuvwxyz
abcdefghigklmnopqrstvwxyzabcdeghigklmnoprstuvwxyz
abcdefghigklmnopqrstuwxyzabcdefhigklmnopqstuvwxyz
abcdefghigklmnopqrstuwxyzabcdefhigklmnopqstuvwxyz
abcdefghigklmnopqrstuwxyzabcdefhigklmnopqstuvwxyz
abcdefghigklmnopqrstuwxyzabcdefhigklmnopqstuvwxyz
abcdefghigklmnopqrstvwxyzabcdeghigklmnoprstuvwxyz
abcdefghigklmnopqrstuwxyzabcdefhigklmnopqstuvwxyz
abcdefghigklmnopqrstvwxyzabcdeghigklmnopqstuvwxyz
abcdefghigklmnopqrstuwxyzabcdefhigklmnopqstuvwxyz
abcdefghigklmnopqrstuwxyzabcdefhigklmnopqstuvwxyz
abcdefghigklmnopqrstuwxyzabcdefhigklmnoprstuvwxyz
abcdefghigklmnopqrstvwxyzabcdeghigklmnoprstuvwxyz
abcdefghigklmnopqrstuwxyzabcdefhigklmnopqstuvwxyz
abcdefghigklmnopqrstuwxyzabcdefhigklmnopqstuvwxyz
abcdefghigklmnopqrstvwxyzabcdeghigklmnoprstuvwxyz
abcdefghigklmnopqrstvwxyzabcdeghigklmnoprstuvwxyz
abcdefghigklmnopqrstuwxyzabcdefhigklmnopqstuvwxyz
abcdefghigklmnopqrstvwxyzabcdeghigklmnoprstuvwxyz
abcdefghigklmnopqrstuwxyzabcdefhigklmnopqstuvwxyz
abcdefghigklmnopqrstuwxyzabcdefhigklmnopqstuvwxyz
总是特定的位会丢失!程序中也做了相应的判断,不知道那里出了问题?



ssssssssssss
2楼-- · 2019-07-22 07:53
yaxeff 发表于 2016-12-20 22:01
以上是直接转发的代码,当然没有其他处理,就蓝牙那点数据量完全可行.
而如果你一定要使用DMA接收的话需要 ...

void USART1_IRQHandler(void)
{       

        if(USART1->SR&BIT5)                                                        //接收到数据
        {       
            DMA1->IFCR|=(1<<25); //清除通道4传输完成标志          
            DMAbuffer2[0]=USART1->DR;       
            USART2DMA_Enable(DMA1_Channel7,1);                       
            Uart2ClearDmaFlag();                                
            USART1->SR &= ~BIT5;               
        }               
}

void Uart1ClearDmaFlag(void)
{
  while(1)
  {
    if(DMA1->ISR&(1<<13))//等待通道4传输完成
        {
                DMA1->IFCR|=(1<<13); //清除通道4传输完成标志
                break;
    }
  }
}
void Uart2ClearDmaFlag(void)
{
while(1)
{
    if(DMA1->ISR&(1<<25))//等待通道4传输完成
        {
                DMA1->IFCR|=(1<<25); //清除通道4传输完成标志
                        break;
    }
}
}
yaxeff
3楼-- · 2019-07-22 12:34
 精彩回答 2  元偷偷看……

一周热门 更多>