This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CCS6全局变量的问题



我的代码里main.c是一个函数,然后中断又单独写了一个interrupt.c函数,在interrupt.c里面有个串口接收程序,然后在interrupt.c里面定义的串口全局接收数组,在接收中断里都正确收到数据了,然后我在main.c里面使用extern unsigned char Rx_Data[40]这种方式来引用接收数组,然后发现数据传不过来,中断函数里能收到的数据,到了主函数,就像完全没有接收到一样,是我的数组定义方式不对,不符合CCS自己的规范吗

  • 请问您现在使用是哪款芯片?能否贴出相关的代码?
  • MCU是28335,代码如下struct Serial
    {
    unsigned Rx_End :1;
    unsigned Tx_End :1;
    unsigned char Tx_Data[64];//
    unsigned char Rx_Data[64];//
    };这个是一个头文件中定义的结构体

    struct Serial Serial_B;
    struct Serial *SCIB = &Serial_B;这个是中断函数中对结构体实例化定义的全局接收变量

    //---------------------------------------------------------
    //SCIB接收中断处理程序,FIFO模式
    //---------------------------------------------------------
    interrupt void ScibRxFifo_ISR(void)
    {
    unsigned char i;
    PieCtrlRegs.PIEACK.bit.ACK9 = 1;
    ScibRegs.SCIFFRX.bit.RXFFINTCLR = 1;
    for(i=0;i<11;i++)
    {
    SCIB->Rx_Data[i] = ScibRegs.SCIRXBUF.bit.RXDT;

    }
    if(SCIB->Rx_Data[8] == 10)
    LED3 = ~LED3;
    SCIB->Rx_End = 1;
    }这是SCIB接收中断函数,LED3能随着PC机端发来的数据而循环亮和灭,用的是11个字节中断深度的FIFO模式,说明接收正确

    extern struct Serial *SCIB;这个是是main.c中对全局变量的引用

    while(1)
    {
    //CAN_Send(8,0x123);
    //LED3 = ~LED3;
    //Delay(800000);
    //Serial.
    //while(Flag.Rx_End == 1)
    while(SCIB->Rx_End == 1)
    {
    LED2 = ~LED2;
    SCIB->Rx_End = 0;
    SerialData_CheckSum();
    }
    }这是main.c中对接收标志位的判断,随着数据的接收完毕,LED2也是循环的亮灭,说明标志位设置正确

    /-----------------------------------------------------------------
    //计算串口数据校验和
    //-----------------------------------------------------------------
    void SerialData_CheckSum(void)
    {
    Uint16 Check_Sum[2] = {0,0};
    Check_Sum[1] = Rx_Data[10];//SCIB->Rx_Data[10];
    Check_Sum[1] = Check_Sum[1] << 8 ;
    Check_Sum[1] = Check_Sum[1] + Rx_Data[9];//SCIB->Rx_Data[9];
    //Check_Sum[0] = Calculate_CheckSum(9,SCIB);
    //if(Check_Sum[0] == Check_Sum[1])
    //if(SCIB->Rx_Data[8] == 10)
    if(SCIB->Rx_Data[8] == 10)
    {
    LED1 = ~LED1;
    UART_Command_Parse(&Rx_Data[0]);//(Motor,SCIB);//调用串口命令解析
    }
    }这里,本打算做校验和计算,但发现全局变量的传递有问题,于是先不计算校验和,而是在这里再一次的判断SCIB->Rx_Data[8] 中的数据是否为10,结果发现到这里就不是10了,而在接收中断是正确接收到10这个数据的,PC端也确实发的是10,这就是我的问题
  • “于是先不计算校验和,而是在这里再一次的判断SCIB->Rx_Data[8] 中的数据是否为10,结果发现到这里就不是10了”

    那您是否有在线调试看这个SCIB->Rx_Data[8]中的数据是多少?是否为0?

    CCS的编译器会给未初始化的全局变量随机分配一个值,它在存储空间的地址是固定的。
  • 感觉还是你的程序逻辑不严谨导致的

    1.总觉得下面这句不严谨,应该加上大括号

    if(SCIB->Rx_Data[8] == 10)
    LED3 = ~LED3;
    SCIB->Rx_End = 1;

    2.可以在中断中加入判断,只有SCIB->Rx_End为0的时候才进行数据的接收。

  • 刚试了,确实是0,但我不是进调试模式看的,用的串口发送,在校验那个地方定义了一个局部变量char,把Rx_Data[8]的值赋值给这个局部变量然后发出去,我用逻辑分析仪看的串口发送数据线,确实是0,如果要进调试模式,要改一堆东西,我现在是把代码从flash搬移到RAM跑的方式
  • 是不太严谨,但可能也有误解,LED3取反那个语句是应该往右进几格的,但刚我复制代码过来就变成这样了,if判断只涉及到LED3的亮灭,SCIB->Rx_End的状态与if语句无关