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.

F28069 SCI发送时丢掉最后两个字符

你好!

遇到一个比较奇怪的问题。

程序比较简单,用SCI发送一个字符串,串口调试助手总是收不到最后两个字符,用示波器观察,示波器显示的波形跟串口调试助手收到的字符是对应的。但是我看到SCI寄存器的SCITXBUF已经写入了字符串的最后一个字符。

例如,我先定义一个字符串“abcdefg\0”, 用sci 查询发送,没有用FIFO,直到遇到‘\0’。但是串口调试助手只能收到abcde, 但是到最后SCITXBUF里面的是‘g’。

如果发送两个字符串,则第一个字符串里的字节会都收到,但是第二个字符串的最后两个字节会丢失。

实在想不出什么原因。

  • 请先检查下波特率的设置;
    还建议您换更个串口助手再做测试。
  • 应该不是波特率的问题,其他字符收的没问题,按照不同时钟下将波特率设置为同一值(9600),都为乱码。
    串口调试助手都换了好几个了,同样的问题。
  • 试下TI的例程,scia_loopback_interrupts,不要用loop back模式,根据手册修改下波特率看下数据收发是否正确,排除下硬件的原因。
  • 好的,我明天先试下。
  • 间隔发送的过程中增加一些延时 或者判断上一次发送结束了再启动发送下一个试试
  • //=======================================================================================
    //  FILE:           test - main.c
    //=======================================================================================
    #include "DSP28x_Project.h"

    //---------------------------------------------------------------------------------------
    // FUNCTION PROTOTYPES
    //---------------------------------------------------------------------------------------
    void SciaSendByte(char a);                 // Send a character from the SCI
    void SciaSendMsg(char *msg);               // Send a string from the SCIA

    //---------------------------------------------------------------------------------------
    // VARIABLE DECLARATIONS - GENERAL
    //---------------------------------------------------------------------------------------
    Uint16 ReceivedChar;
    char *msg;

    //=======================================================================================
    // MAIN CODE - starts here
    //=======================================================================================
    void main(void)
    {
        DisableDog();           // Disable the watchdog
        InitPieCtrl();          // Initializes the PIE control registers to a default state.
        IER = 0x0000;
        IFR = 0x0000;           // Disable CPU interrupts and clear all CPU interrupt flags.
        InitPieVectTable();     // Initialize the PIE vector table.

        EALLOW;
        SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;  // Enable ADC peripheral clock
        (*Device_cal)();
        SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 0;  // Return ADC clock to original state
        EDIS;

        InitPll(DSP28_PLLCR, DSP28_DIVSEL);    // Initialize the PLL control: PLLCR and CLKINDIV.

        EALLOW;
        SysCtrlRegs.LOSPCP.all = 0x0002;       // low speed clock = SYSCLKOUT/4  22.5MHz@90MHz
        SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1; // Enable SCI-A clock
        EDIS;

        EALLOW;
        GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1;   // set GPIO28 = SCIRXDA
        GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0;    // Enable pull-up for GPIO28 (SCIRXDA)
        GpioCtrlRegs.GPAQSEL2.bit.GPIO28 = 3;  // Asynchronous input GPIO28 (SCIRXDA)

        GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 1;   // set GPIO29 = SCITXDA
        //GpioCtrlRegs.GPAPUD.bit.GPIO29 = 0;    // Enable pull-up for GPIO29 (SCITXDA)

        GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0;   // set GPIO34 as DE of RS485
        GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;    // set GPIO34 output
        GpioDataRegs.GPBSET.bit.GPIO34 = 1;    // set GPIO34 output high initially(set RS485 send)
        EDIS;

        // Initiate SCI-A
        SciaRegs.SCICCR.all =0x0007;           // 1 stop bit, 8 char bits, No parity,
                                               // No loopback, async mode, idle-line protocol
        SciaRegs.SCICTL1.all =0x0003;          // enable TX, RX, internal SCICLK,
                                               // Disable RX ERR, SLEEP, TXWAKE
        SciaRegs.SCIHBAUD    =0x0001;          // 9600 baud @LSPCLK = 22.5MHz (90 MHz SYSCLK).
        SciaRegs.SCILBAUD    =0x0024;
        SciaRegs.SCICTL1.all =0x0023;          // Relinquish SCI from Reset.


        SciaSendByte('a');
        DELAY_US(5000);
        SciaSendByte('b');
        SciaSendByte('c');

        msg = "\r\nHello World!\0";
        SciaSendMsg(msg);

        msg = "\r\nYou will enter a character, and the DSP will echo it back!\0";
        SciaSendMsg(msg);

        //-----------------------------------------------------------------------------------
        //  MAIN LOOP
        //-----------------------------------------------------------------------------------
        for(;;)  //infinite loop
        {

            msg = "\r\nEnter: \0";
            SciaSendMsg(msg);
            //DELAY_US(5000);


            //GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1;     // set rs485 receive

            // Wait to receive a character
            while(SciaRegs.SCIRXST.bit.RXRDY == 0)
                ;

            ReceivedChar = SciaRegs.SCIRXBUF.all;     // Get the character
            //DELAY_US(5000);

            //GpioDataRegs.GPBSET.bit.GPIO34 = 1;       // set rs485 send

            // Echo character back
            msg = "  You sent: \0";
            SciaSendMsg(msg);
            SciaSendByte(ReceivedChar);

        }  // END OF MAIN LOOP

    } //END MAIN CODE


    // send a character from the SCI-A
    void SciaSendByte(char a)
    {
        while(!(SciaRegs.SCICTL2.bit.TXRDY))
            ;
        SciaRegs.SCITXBUF = a;
    }

    // send a string from the SCI-A
    void SciaSendMsg(char *msg)
    {
        int i = 0;
        while(msg[i] != '\0'){
            SciaSendByte(msg[i]);
            i++;
        }
    }

    //=======================================================================================
    // End of file.
    //=======================================================================================

    先把程序贴上来,都整到这一个文件里了。

    昨天我用的是RS485,在主函数里有一个设置发送和接收(GPIO34),今天先加入了延时(DELAY_US(5000);),发现可以接收到所有字符。换了个板子用

    RS232试,就不用加这个延时,因为RS232不用设置发送和接收。

    但是无论是RS485还是RS232,我在main函数前用发送单个字符测试,就发送一个字符‘a’,如果不加延时,单步运行就收不到。加了延时,单步运行到延时结束才能收到。不加延时,只有单步运行完SciaSendByte('c');才能收到字符‘a’。

    我觉得挺奇怪的。难道我的发送单个字符的函数有问题还是SCI设置有问题?