如何使用STM32F103RCT6的串口1与串口2进行数据转发

2019-07-14 15:13发布

我现在因为一些事情需要使用单片机来编程,以前了解过一点51,简单用过arduino,对编程的精髓不了解,现在必须使用32了,完全懵了。
  我现在需要使用32的USART1接电脑,USART2连接一个SIM卡模块,(硬件已经连接好了,并且是在一块板子上USART2没有接出来,无法确定状态。)我需要写一段代码来完成 这中间AT指令的转发。从USART1接收到的数据转发给USART2,同时等待USART2返回数据,然后再通过USART1发送给电脑,就相当于32做了一个中继。
我现在毫无头绪,有人来指点下 这个程序的 编程思路应该怎么样的,例如使不使用中断,或者在主函数内顺序执行。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
16条回答
比吥匕卟
1楼-- · 2019-07-15 10:56
我做过一个模块是,跟你的差不多,uart口1 就收到的原样发给uart2  ,uart2接DTU的模块(插入SIM卡可以上公网的那种) uart2的自动的去做初始化 和链接基站的(包括重连)的动作 ,然后检测到uart1有数据过来就将包转成AT指令的通过DTU模块转出去,uart2 接收的数据在将AT部分解掉再转给uart1,整个设备的参数包括IP地址,端口之类的通过uart1设置。(整个模块的功能实际上就是串口转网络的功能,项目上要用 网上买一个这个玩意要500块左右,所以就自己做了)
joereil
2楼-- · 2019-07-15 13:15
 精彩回答 2  元偷偷看……
hdfsf
3楼-- · 2019-07-15 15:49
单片机串口,一般都是采用主动发送,中断接受! 你这里面,两个串口接受中断,接收到数据后,单片机转发。当然,还可以考虑DMA,不过我没有试过可以还是不可以。如果可以,你配置好通道,然后就可以什么都不用做了!
gvjhvbc
4楼-- · 2019-07-15 20:56
先用串口助手这些工具调通每一个串口,电脑的串口助手自不必说,stm32的两个串口的收发都调通,然后是sim卡,我不知道你这个sim卡的串口有没有回复信息;sim卡也是有回应的是不是,用串口助手简单调试一下看看能不能正常工作就可以了。然后你再考虑整体怎么做 3楼和6楼已经给出方法了
juanll5
5楼-- · 2019-07-15 22:28
重定向可以吧
ROSE1017
6楼-- · 2019-07-15 23:39
1、开启第二个串口的接收中断,判断接收完成之后发送
2、开启第二串口的接收中断,设置标志位;在主循环里面不断访问这个标志位,当标志位显示完成之后,开始发送
主循环函数:
  1. void uart2_tips(void)
  2. {
  3.     if(USART2_RX_STA&0x8000)
  4.     {                       
  5.         len=USART2_RX_STA&0x3fff;    //得到此次接收到的数据长度
  6.         printf(" 您发送的USART2消息为: ");
  7.         for(t=0;t<len;t++)
  8.         {
  9.             USART_SendData(USART1, USART2_RX_BUF[t]);//向串口1发送数据
  10.             while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
  11.         }
  12.         command_operate(USART2_RX_BUF,USART2_RX_STA);
  13.         printf(" ");//插入换行
  14.         USART2_RX_STA=0;
  15.     }else
  16.     {
  17.         times++;
  18.         if(times%5000==0)
  19.         {
  20.             printf(" STM32 USART2 ");
  21.         }
  22.         delay_ms(10);   
  23.     }
  24. }
复制代码
串口二中断处理函数(仿照正点原子的例程):
  1. void USART2_IRQHandler(void)                    //串口1中断服务程序
  2. {
  3.     u8 Res;
  4. #if SYSTEM_SUPPORT_OS         //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
  5.     OSIntEnter();   
  6. #endif
  7.     if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
  8.     {
  9.         Res =USART_ReceiveData(USART2);    //读取接收到的数据
  10.          
  11.         if((USART2_RX_STA&0x8000)==0)//接收未完成
  12.         {
  13.             if(USART2_RX_STA&0x4000)//接收到了0x0d
  14.             {
  15.                 if(Res!=0x24)USART2_RX_STA=0;//接收错误,重新开始
  16.                 else USART2_RX_STA|=0x8000;    //接收完成了
  17.             }
  18.             else //还没收到0X0D
  19.             {   
  20.                 if(Res==0x24)
  21.                     USART2_RX_STA|=0x4000;
  22.                 else
  23.                 {
  24.                     USART2_RX_BUF[USART2_RX_STA&0X3FFF]=Res ;
  25.                     USART2_RX_STA++;
  26.                     if(USART2_RX_STA>(USART_REC_LEN-1))USART2_RX_STA=0;//接收数据错误,重新开始接收      
  27.                 }         
  28.             }
  29.         }            
  30.      }
  31. #if SYSTEM_SUPPORT_OS     //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
  32.     OSIntExit();                                               
  33. #endif
  34. }
复制代码
串口2设置:
  1. void uart2_init(u32 bound){
  2.   //GPIO端口设置
  3.     GPIO_InitTypeDef GPIO_InitStructure;
  4.     USART_InitTypeDef USART_InitStructure;
  5.     NVIC_InitTypeDef NVIC_InitStructure;
  6.       
  7.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);    //使能USART1,GPIOA时钟
  8.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
  9.      
  10.     //USART1_TX   GPIOA.9
  11.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.9
  12.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  13.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出
  14.     GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
  15.    
  16.   //USART1_RX      GPIOA.10初始化
  17.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA10
  18.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  19.     GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  

  20.   //Usart1 NVIC 配置
  21.     NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
  22.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
  23.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;        //子优先级3
  24.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道使能
  25.     NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器
  26.    
  27.    //USART 初始化设置

  28.     USART_InitStructure.USART_BaudRate = bound;//串口波特率
  29.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
  30.     USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
  31.     USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
  32.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
  33.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;    //收发模式

  34.     USART_Init(USART2, &USART_InitStructure); //初始化串口1
  35.     USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串口接受中断
  36.     USART_Cmd(USART2, ENABLE);                    //使能串口1
  37. }
复制代码

一周热门 更多>