使用中断

时间:2017-07-31 09:45:42

标签: c embedded

我使用dspic33f系列微控制器从调制解调器SIM800A接收短信。我使用中断方法通过串行通信接收来自调制解调器的响应。如果我通过UART顺序向调制解调器发送多个AT命令,我只是对第一个命令的响应进入接收缓冲区,而在调制解调器响应的情况下,其余命令在接收缓冲区中没有响应。 调试后我发现了这种奇特行为的原因。原因是在接收到缓冲区的响应并在控制台上打印之后,即在使用c中的memset函数通过UART向调制解调器发送下一个命令之前,我正在清除接收缓冲区。 但是在评论这个memset函数时,我能够接收到顺序发送的所有AT命令的接收缓冲区的响应,如果没有注释memset函数,那么虽然调制解调器响应但是接收缓冲区没有响应,所以请帮助将响应接收到缓冲区中。

我写的代码

#include "p33FJ64GS606.h"

#include <stdio.h>
#define FCY         40000000UL
#include <libpic30.h>
#include <string.h>
_FOSC(FCKSM_CSECMD & OSCIOFNC_OFF)
_FWDT(FWDTEN_OFF)
_FPOR(FPWRT_PWR128 )
_FICD(ICS_PGD1 & JTAGEN_OFF) 

char StringLoop[161];
void Init_Uart1(int uart_no)
{   
    U1MODEbits.STSEL = 0; // 1-Stop bit
    U1MODEbits.PDSEL = 0; // No Parity, 8-Data bits
    U1MODEbits.ABAUD = 0; // Auto-Baud disabled
    U1MODEbits.BRGH = 0; // Standard-Speed mode
    U1BRG = UBRG1_VALUE; // Baud Rate setting for 115200
    U1STAbits.UTXISEL0 = 0; // Interrupt after one TX character is transmitted
    U1STAbits.UTXISEL1 = 0;
    U1STAbits.URXISEL0 = 0;
    U1STAbits.URXISEL1 = 0;//jkv
    IEC0bits.U1RXIE = 1;
    IEC0bits.U1TXIE = 0; // Enable UART TX interrupt
    U1MODEbits.UARTEN = 1; // Enable UART
    U1STAbits.UTXEN = 1; // Enable UART TX
    U1MODEbits.USIDL=0;
}

void UART1_puts(unsigned char data)
{   
    while (U1STAbits.TRMT==0);
      U1TXREG = data;


}

void UART1_send(unsigned char *s)
{
    memset(StringLoop,'\0',sizeof(StringLoop)); /* if I comment this line then i can receive the response into the buffer StringLoop continuously else i receive the response only for the 1st AT command and I don't get the response for other AT commands into the StringLoop though the modem is responding*/
    while(*s)
    {   
    UART1_puts(*s);
    s++;


    }
}

void __attribute__((interrupt, no_auto_psv)) _U1RXInterrupt(void)
{

    if(IFS0bits.U1RXIF)
    {

       StringLoop[rcindex++] = U1RXREG;
       if (rcindex >= (sizeof(StringLoop) - 1))
            rcindex = 0;          
  }  
    IFS0bits.U1RXIF=0;
    }
}
void main()
{
    int i=0,j=0;
    Init_Clocks();
    Init_Uart2(1);
    Init_Uart1(1);
    TRISFbits.TRISF1=0; 
    LATFbits.LATF1=1;
    UART1_send("AT+CMGR=1\r\n");    
    __delay_ms(2000);
    printf("stringloop is %s\n",StringLoop);

   UART1_send("AT+CPMS=?\r\n"); 
    __delay_ms(2000);
    printf("stringloop is %s\n",StringLoop);

    UART1_send("AT+CPMS?\r\n"); 
    __delay_ms(2000);
    printf("stringloop is %s\n",StringLoop);

}

0 个答案:

没有答案