SCI如何接收一组数据

2019-07-27 16:34发布

#include "DSP28x_Project.h"     // Device Headerfile and Examples Include File
unsigned int Sci_VarRx,temp_RX;
unsigned int Sci_VarTx;
volatile Uint16 *  ptr;
int Send_Flag;
int SciaTx_Ready(void);
int SciaRx_Ready(void);
int Rx_flag,ix,ii,n;
int Tx_flag;
void Scia_init(void);
int str_TX[]={0x01,0x03,0x21,0x00,0x00,0x01};//010321000001  
unsigned int Crc_16();
unsigned int crc16,crc1,crc2;
unsigned int str_RX[100];
int Rx_Int16=0x1234;

void main(void)
{   

    crc16=Crc_16();
    crc1=crc16%256;
    crc2=crc16/256;
   
   
    Rx_flag=0;
    Tx_flag=0;
    Sci_VarRx = 0;
    Sci_VarTx = 0;   
    Send_Flag = 0;
    InitSysCtrl();//LSPCLK=SYSCLKOUT/2=60MHZ/2=30MHZ
    InitSciaGpio();
EALLOW;
      GpioCtrlRegs.GPAPUD.bit.GPIO25 = 0;     //配置485-RTS使能上拉
      GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 0;    //配置485-RTS的GPIO25为IO功能
      GpioCtrlRegs.GPADIR.bit.GPIO25 = 1;     //配置485-RTS为输出
      GpioDataRegs.GPADAT.bit.GPIO25 = 0;     //设置485-RTS默认输出为低电平
   EDIS;

    DINT;
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
    Scia_init();
    EnableInterrupts();
      
     PieCtrlRegs.PIECTRL.bit.ENPIE = 1;   
     EINT;   
     ERTM;   
      
for(;;)
    {
        SciaRx_Ready();
        if(Rx_flag == 1)
            {   
                  ix=0;
                  while(SciaRegs.SCIRXST.bit.RXRDY == 1)
                          {
                              str_RX[ix]=0;
                              str_RX[ix]= SciaRegs.SCIRXBUF.all;
                              DELAY_US(1000);
                              ix++;
                          }
                  SciaTx_Ready();
                  if(Tx_flag==1)
                       {   
                            n=sizeof(str_RX)/sizeof(int);
                            for(ii=0;ii<n;ii++)
                                  {
                                      SciaRegs.SCITXBUF =str_RX[ii];
                                       DELAY_US(1000);
                                   }

                               }
                         }
                }
}

void Scia_init()
{
     SciaRegs.SCICCR.all =0x0007;   // 设置通信控制寄存器                           
     SciaRegs.SCICTL1.all =0x0003;  // 设置SCI控制寄存器1
     SciaRegs.SCICTL2.all =0x0003;//设置控制寄存器2
     SciaRegs.SCICTL2.bit.TXINTENA =1; //使能TXRDY中断
     SciaRegs.SCICTL2.bit.RXBKINTENA =1; //使能RXRDY/BRKDT中断
     SciaRegs.SCIHBAUD    =0x0000;  //
     SciaRegs.SCILBAUD    =0x00C2
     SciaRegs.SCICTL1.all =0x0023;     // 0x0023 = 0010 0011
                                //SW RESET = 1(系统复位后,向此位写入1将重新使能SCI)

}
int SciaRx_Ready()
{   
     GpioDataRegs.GPADAT.bit.GPIO25 = 0; //低电平,收数据
     DELAY_US(10000);
    if(SciaRegs.SCIRXST.bit.RXRDY == 1)
         {
            Rx_flag = 1;  
        }
    else
       {
          Rx_flag=0;
       }
   return(Rx_flag);
}

int SciaTx_Ready(void)
  {   
    GpioDataRegs.GPADAT.bit.GPIO25 = 1; //高电平,发数据
    DELAY_US(10000);
    if(SciaRegs.SCICTL2.bit.TXRDY == 1)
     {
            Tx_flag=1;
      }
     else
     {
           Tx_flag=0;
      }
    return(Tx_flag);
}

上述程序要实现的功能是:DSP通过485与PC机的“串口调试软件”通讯,“串口调试软件”首先按十六制发送一个串03 03 20 00 00 01,DSP接收到后,把接收的值 01 03 20 00 00 01发送给PC,即把接收到的值,发送给PC。
现在的问题是:串口调试软件只能接收到01,其它的接收不到;如果用串口调试软件发送02、03或04给DSP时,接收值都是正确的(即02、03、04),PC就是在发送多个值时,DSP只能接收到最后一个值。我查看了DSP接收数组的内容 ,只有str_RX[0]有接收值,即上述的01;如果DSP单独发送str_TX数据的值时,PC接收是正确的;可能是DSP程序的接收部分的语句有点问题,请各位指点一下!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
14条回答
z_jzhao
2019-07-28 10:35
我的要求很简单,就是用串口调试软件发送01 06 20 00 00 01 02 31,只要DSP能接收到就行,谁有这样的例程发一个给我也行啊。最要是28035上面可以运行的,多谢!

一周热门 更多>