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条回答
meng219902
1楼-- · 2019-07-27 22:01
对不起, 我不太懂485  但是我懂点SCI   
第一呢,我看了你的程序,很多毛病,   我挑主要的说吧,我也遇到过,我第一意识告诉我是FIFO的问题,我看到你没有初始化FIFO,这个你查看一下,是不是有问题,这个FIFO最好是关掉,因为我们接受数据的时候,是不确定数据的长度的,如果你确定了深度的话(如:15个深度),那么你要等15个字(数字、char等等),我感觉很麻烦,
第二个就是 你用的是等待的办法来接受数据的,那么在单片机里面可能是好使的(因为我也是从那学过来的),但是对于DSP2000系列,你最好是用中断,dsp接受一个数据就中断一次,直到没有数据发过来为止,我个人感觉很方便, interrupt void scibRxFifoIsr(void)
{
        Uint16 i;
        i=ScibRegs.SCIRXBUF.all;
                  scib_xmit(i);   //接受到dsp的数据,立刻就再从dsp发送给PC机
        ScibRegs.SCIFFRX.bit.RXFFOVRCLR=1;  // Clear Overflow flag
        ScibRegs.SCIFFRX.bit.RXFFINTCLR=1;         // Clear Interrupt flag
        PieCtrlRegs.PIEACK.all|=0x100;          // Issue PIE ack

}
meng219902
2楼-- · 2019-07-28 02:26
现在的问题是:串口调试软件只能接收到01,其它的接收不到;如果用串口调试软件发送02、03或04给DSP时,接收值都是正确的(即02、03、04),PC就是在发送多个值时,DSP只能接收到最后一个值。我查看了DSP接收数组的内容 ,只有str_RX[0]有接收值,即上述的01;如果DSP单独发送str_TX数据的值时,PC接收是正确的;可能是DSP程序的接收部分的语句有点问题,请各位指点一下!

还有你出现的这个问题,我还像遇到过,也好像没遇到过,SciaRegs.SCICTL2.bit..RXRDY  不管PC给多少数,但是dsp只能接受到一个数(第一个数),剩下的数就丢失了,。。。。。不要听我的,也有可能是你程序的问题,如
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++;
                          }
确实当dsp接受到第一数的时候,READY==1;那么你有没有想想,当第一个数传给 str_RX[ix]的时候,ready是不是==0;了呢,会不会就在那时候跳出循环了呢?(我懂你写这个程序的意思,但是事与愿违,)
还有你说你只能看到str_RX[0]的数组有数,你没注意你写的程序就有问题吗?但Rx_flag == 1;就进入循环的时候,你的第一句话ix=0; 是造成str_RX[ix]只显示第一个数的原因吗?
  我就说这么多,希望我说的对你有帮助
z_jzhao
3楼-- · 2019-07-28 06:15
 精彩回答 2  元偷偷看……
z_jzhao
4楼-- · 2019-07-28 06:25
该如何更改?
meng219902
5楼-- · 2019-07-28 08:20
这个也可能是你的串口调试助手的问题    你试试
是  接受都没有问题,你是指的是一个数据?还是很多个呢?我理解你的意思是 一个数据,你没有用中断吗?
meng219902
6楼-- · 2019-07-28 09:54
我想你应该有这个软件把? 里面有个串口调试助手
你试试

一周热门 更多>