关于STM32F103RCT6的串口1和串口2的数据转发问题

2019-08-17 03:25发布

本帖最后由 野驴 于 2017-7-4 15:13 编辑

本人32小白一个,刚刚因为需要调试一个东西接触到32,并且对单片机编程以前学过但是好久没碰了,现在使用32有些问题来求教。
我手里的东西 是一块32rct6与一个sim卡模块相连(USART2),我需要在电脑上连接32的USART1发送AT指令然后32通过串口2转给SIM卡模块,
SIM卡模块接收到AT指令会有一个返回,然后32 接收串口2 发回的数据在从串口1 发送给电脑,但是现在试了很多方法都不行,(可能我的想法就是有问题的)
我粘贴部分代码上来,求大神给看看。
[mw_shl_code=applescript,true]void USART2_IRQHandler(void)
{
u8 Rec;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
  Rec =USART_ReceiveData(USART2);
  if((USART2_RX_STA&0x8000)==0)//½óêÕÎ′íê3é  
{
   if(USART2_RX_STA&0x4000)//½óêÕμ½áË0x0d
  {
    if(Rec!=0x0a)USART2_RX_STA=0;
    else USART2_RX_STA|=0x8000;
  }
else
                                {        
                                if(Rec==0x0d)USART2_RX_STA|=0x4000;
                                else
                                        {
                                        USART_RX_BUF[USART2_RX_STA&0X3FFF]=Rec ;
                                        USART2_RX_STA++;
                                        if(USART2_RX_STA>(USART_REC_LEN-1))USART2_RX_STA=0;//½óêÕêy¾Y′íÎó,ÖØD¿aê¼½óêÕ         
                                        }                 
                                }
                        }                    
     }         
}[/mw_shl_code]
上面这段是仿照原子的USART.c里面写的一个串口2 的中断函数。
USART1抢断优先级3 子优先级3  USART2的抢断优先级3 子优先级2.
[mw_shl_code=c,true]        if(USART_RX_STA&0x8000)
                {                                          
                        len=USART_RX_STA&0x3fff;
                        printf("USART1::");

                        for(t=0;t<len;t++)
                        {
                                USART2->DR=USART_RX_BUF[t];
                                USART1->DR=USART_RX_BUF[t];
                                while((USART1->SR&0X40)==0);
                                if(USART2_RX_STA&0x8000)
                                {
                                        len2=USART2_RX_STA&0x3fff;
                                        printf("USART2::");
                                        for(t=0;t<len2;t++)
                                        {
                                                USART1->DR=USART_RX_BUF[t];
                                                while((USART1->SR&0X40)==0);
                                        }
                                }
                        }
                        printf(" ");
USART_RX_STA=0;
                }else
                {
                        times++;

  if(times%30==0)
    {LED0=!LED0;
    LED1=!LED1;}
                        delay_ms(10);   
                }
        }         
}
[/mw_shl_code]
这段是仿照 原子哥的串口实验里面的while循环我在中间加入了 USART2的部分。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
17条回答
野驴
1楼-- · 2019-08-17 04:18
@正点原子  原子哥来帮帮忙呗,感激不尽
ARM学员
2楼-- · 2019-08-17 06:49
兄弟,帮你顶一个,你这代码真的看不下去了,可读性太差了,别用寄存器操作的方式,你自己心里明白就行了,少用。
野驴
3楼-- · 2019-08-17 10:40
ARM学员 发表于 2017-7-4 09:09
兄弟,帮你顶一个,你这代码真的看不下去了,可读性太差了,别用寄存器操作的方式,你自己心里明白就行了, ...

不是很懂,很多地方都是看着原子哥的各种例程 粘贴过来的
ARM学员
4楼-- · 2019-08-17 14:49
野驴 发表于 2017-7-4 09:11
不是很懂,很多地方都是看着原子哥的各种例程 粘贴过来的

尽量少在中断里面做逻辑判断,中断里面只负责接受数据就可以了,在主线程里面再做逻辑处理。
野驴
5楼-- · 2019-08-17 15:21
 精彩回答 2  元偷偷看……
执迷
6楼-- · 2019-08-17 20:40
干嘛急着上模块,,先用电脑看串口收发程序是不是正常的。。多看看模块手册。。有些模块要开机时序的。。别人的东西只是参考不是拿过来就能用的

一周热门 更多>