ch582m串口接收到的数据保存只能是6字节以下或者6字节倍数

void UART3_IRQHandler(void)

{

    volatile uint8_t i = 0;


    switch(UART3_GetITFlag())

    {

        case UART_II_LINE_STAT: // 线路状态错误

        {

            UART3_GetLinSTA();

            break;

        }


        case UART_II_RECV_RDY: // 数据达到设置触发点

            for(i = 0; i != (trigB -1); i++)

            {

                RxBuff[i] = UART3_RecvByte();

                UART3_SendByte(RxBuff[i]);

            }

            break;


        case UART_II_RECV_TOUT: // 接收超时,暂时一帧数据接收完成

            i = UART3_RecvString(RxBuff);     //123456789

            PRINT("RxBuff_1=%s\r\n",RxBuff);  //67895

            UART3_SendString(RxBuff, i);       //123456789

            PRINT("RxBuff_2=%s\r\n",RxBuff);   //67895


//            strcpy(TestBuf1,RxBuff); //67895

//            EEPROM_ERASE(0, EEPROM_BLOCK_SIZE);

//            EEPROM_WRITE(0, TestBuf1, 1024); //串口接收到的数据保存到flash中:蓝牙名字

//            PRINT("TestBuf1 = %s\n",TestBuf1);//67895

            PRINT("uart3_11111\n");

            break;


        case UART_II_THR_EMPTY: // 发送缓存区空,可继续发送

            break;


        case UART_II_MODEM_CHG: // 只支持串口0

            break;


        default:

            break;

    }

    FLAG = 0;                               //接收数据完成,关闭停止进入睡眠的标志

}



我串口给uart3发送数据123456789,然后打印RxBuff显示为67895(错误的);可ch582m的uart3在会给我的串口又是123456789(正确的);再次打印RxBuff又显示为67895(错误的);

并且我发好像只能保存6字节以下,6的倍数会被自动清除;例如我发送123456,数据全是正确的,打印RxBuff显示为7;我发送1234567,打印RxBuff显示为7。

并且我对RxBuff的数据进行任何操作,里面的数据都是错误的,只有UART3_SendString的数据是对的。


请教一下为什么呢?

首先你需要了解下串口接收的机制,如fifo设置的为7,那接收7的整倍数的数据就不会产生超时中断,如不是7的整整倍数则最后的剩下的不到七个字节的数据会在超时中断中接收。

你的程序中接收中断中接收了fifo-1个字节,这样写是为了确保进入超时中断,你用来接收数据的存放接收数据的RxBuff的地址是需要往上加的,然后超时中断里面又从首地址开始放数据,就把之前的覆盖了,UART3_SendString之所以能对,是因为不止调用了一次,在接收中断和超时中断中都有,调用了两次才把完整的数据发出去的。


请教一下我如何给RxBuff的地址往上加呢?我原先使用 strcat(TestBuf1,RxBuff) 来保存,进行字符拼接;本来是可以实现的,但是不知道为什么现在会乱码了,发送6字节就不会。


例程已发送,注意查收。


你好,可以也发我一份例程吗,谢谢


官方例程里面已经做了透传。

如果需要每次进入中断都触发超时,则此处做修改:

image.png


只有登录才能回复,可以选择微信账号登录