OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5059|回复: 14

STM32F103C8T6串口2接收中断,每次都接收到发送的字符串

[复制链接]

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2019-5-17
在线时间
26 小时
发表于 2019-5-29 15:23:19 | 显示全部楼层 |阅读模式
2金钱
STM32F103C8T6的串口2连接sim808模块,每次发送AT指令,接收数组总是把发送内容和接收内容一起放在数组里,比如发送“AT\r\n”,接收到“AT\r\nOK\r\n” ,为什么把发送的内容也收到啦,两天啦,没找到原因,头疼啦


void initSerialPort4G(void){
          GPIO_InitTypeDef GPIO_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    USART_InitTypeDef USART_InitStructure;

    /* Enable the USART2 Pins Software Remapping */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2|RCC_APB2Periph_AFIO, ENABLE);

    /* Configure USART2 Rx (PA.03) as input floating */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;   
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
//                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    /* Configure USART2 Tx (PA.02) as alternate function push-pull */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    /* Enable the USART2 Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);   

    USART_InitStructure.USART_BaudRate = 115200;               
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;     
    USART_InitStructure.USART_Parity = USART_Parity_No;        
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;      

    USART_Init(USART2, &USART_InitStructure);
    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
    /* Enable USART2 */
    USART_Cmd(USART2, ENABLE);

}
void Initial4G(){

        SendCommand4G("AT\r\n", "OK",1);

//        SendCommand4G("AT\r\n", "OK",1);
        SendCommand4G("AT+SAPBR=3,1,\"Contype\",\"GPRS\"\n", "OK",1);

  SendCommand4G("AT+SAPBR=3,1,\"APN\",\"cmnet\"\n", "OK",1);

  SendCommand4G("AT+SAPBR=1,1\n", "OK",1);

}
void SendCommand4G(char* cmd, char *rsp, uint8_t clean)
{                          
//        uint8_t retry=5;
        uint8_t i=0;


                        for(i=0;i<3;i++)
                        {
                                uint16_t len;
                                char * redata;
                                Usart_SendString(USART2,(uint8_t *)cmd);               
                                WaitForTransmitComplete(USART2);
                                Delay_ms(5);
                               
                                redata = get_rebuff2(&len);
                                printf("redata = %s",redata);
                                printf("len = %d",len);
                                if(len>0)
                                {
                                       
                                        if(strncmp(redata,rsp,2) == 0)                               
                                        {
                                                break;
                                        }
                                        else
                                        {
                                                clean_rebuff2();
                                        }
                                }
                                else
                                {                                       
                                        Delay_ms(3);
                                }               
                        }

               
        if(clean==1)
        {
                clean_rebuff2();
        }
        else{
        }
}
void USART2_IRQHandler(void)
{
        Usart2_ReceiveString();
}

void Usart2_ReceiveString(void)
{
    if(uart_p2<UART2_BUFF_SIZE)
    {
        if(USART_GetITStatus(USART2, USART_IT_RXNE) == SET)
        {

                                                USART_ClearITPendingBit(USART2, USART_IT_RXNE);
            uart_buff2[uart_p2] = USART_ReceiveData(USART2);
            uart_p2++;
                                        while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);
//                                                printf("uart_buff2[uart_p2] = %s",uart_buff2[uart_p2]);
        }
    }
                else
                {
                        USART_ClearITPendingBit(USART2, USART_IT_RXNE);
                        clean_rebuff2();      
                }
}

最佳答案

查看完整内容[请看2#楼]

发送指令模块会有指令回复的 比如发送AT\r\n 模块会回复AT\r\nOK\r\n 或者回复AT\r\nERROR\r\n 可以发送ATE0关闭回显,发送AT之后模块就不会返回AT了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

21

主题

2205

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5141
金钱
5141
注册时间
2014-8-26
在线时间
1317 小时
发表于 2019-5-29 15:23:20 | 显示全部楼层
发送指令模块会有指令回复的
比如发送AT\r\n
模块会回复AT\r\nOK\r\n
或者回复AT\r\nERROR\r\n
可以发送ATE0关闭回显,发送AT之后模块就不会返回AT了
回复

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2019-5-17
在线时间
26 小时
 楼主| 发表于 2019-5-29 15:24:53 | 显示全部楼层
@原子哥 , 各位大神,求助啊,到底怎么肥四
回复

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2019-5-17
在线时间
26 小时
 楼主| 发表于 2019-5-29 16:06:57 | 显示全部楼层
我看了一下库函数,会不会是USARTx->DR的数据一直在啊。。
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)
{
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  assert_param(IS_USART_DATA(Data));
   
  /* Transmit Data */
  USARTx->DR = (Data & (uint16_t)0x01FF);
}


uint16_t USART_ReceiveData(USART_TypeDef* USARTx)
{
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  
  /* Receive Data */
  return (uint16_t)(USARTx->DR & (uint16_t)0x01FF);
}
回复

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2019-5-17
在线时间
26 小时
 楼主| 发表于 2019-5-29 16:11:00 | 显示全部楼层
有木有人解答一下啊。。
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-5-29 16:31:30 | 显示全部楼层
看不懂你想干嘛
//                                                printf("uart_buff2[uart_p2] = %s",uart_buff2[uart_p2]);
你是凭这一句已经remark的得知接收数据是什么?
回复

使用道具 举报

4

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2019-5-5
在线时间
13 小时
发表于 2019-5-29 20:51:44 | 显示全部楼层
没错,这些都是传感器返回的信息,好多用AT指令的模块都是这样的返回模式
回复

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2019-5-17
在线时间
26 小时
 楼主| 发表于 2019-5-29 21:29:29 来自手机 | 显示全部楼层
edmund1234 发表于 2019-5-29 16:31
看不懂你想干嘛
//                                                printf("uart_buff2 = %s",uart_buff ...

我是单步调试的时候,发送了AT\r\n后,中断接收的数组里变成了AT\r\nOK\r\n
回复

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2019-5-17
在线时间
26 小时
 楼主| 发表于 2019-5-29 21:30:55 来自手机 | 显示全部楼层
login_FAE 发表于 2019-5-29 18:58
发送指令模块会有指令回复的
比如发送AT\r\n
模块会回复AT\r\nOK\r\n

但是我用串口调试助手直接发送AT的时候,模块就回复了OK。。
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-5-29 21:31:57 | 显示全部楼层
longdawei1987 发表于 2019-5-29 21:29
我是单步调试的时候,发送了AT\r\n后,中断接收的数组里变成了AT\r\nOK\r\n

这是正常的ACK
回复

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2019-5-17
在线时间
26 小时
 楼主| 发表于 2019-5-29 21:37:52 来自手机 | 显示全部楼层
edmund1234 发表于 2019-5-29 21:31
这是正常的ACK

但是用串口调试助手发送的时候,模块只回复了OK,没有重复发送的指令。。
回复

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2019-5-17
在线时间
26 小时
 楼主| 发表于 2019-5-29 21:40:50 来自手机 | 显示全部楼层
edmund1234 发表于 2019-5-29 21:31
这是正常的ACK

好像发送数据的时候,也进了接收中断。。但是也不确定
回复

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2019-5-17
在线时间
26 小时
 楼主| 发表于 2019-5-30 09:57:51 | 显示全部楼层

谢谢大佬,确实我昨天看错了,返回了发送的命令,发送了ATE0 好了,谢谢回答。
回复

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2019-5-17
在线时间
26 小时
 楼主| 发表于 2019-5-30 09:58:38 | 显示全部楼层
login_FAE 发表于 2019-5-29 15:23
发送指令模块会有指令回复的
比如发送AT\r\n
模块会回复AT\r\nOK\r\n

感谢,确实如此,只是发了ATE0之后,回复的前面还有个“\r\n”
回复

使用道具 举报

9

主题

31

帖子

0

精华

高级会员

Rank: 4

积分
620
金钱
620
注册时间
2018-2-4
在线时间
62 小时
发表于 2019-6-6 15:37:46 | 显示全部楼层
不错,进来学习一下。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-17 10:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表