打印
[技术问答]

m051 串口发送数据与接收不一致

[复制链接]
1119|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
aksu|  楼主 | 2020-8-6 15:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序中写死发送固定数据,但是串口工具接收显示与发送并不一致,修改波特率后还是这样。什么原因会导致这种情况呢。[code]void SYS_Init(void)
{
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init System Clock                                                                                       */
    /*---------------------------------------------------------------------------------------------------------*/

    /* Enable Internal RC 22.1184MHz clock */
    CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);

    /* Waiting for Internal RC clock ready */
    CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);

    /* Switch HCLK clock source to Internal RC and HCLK source divide 1 */
    CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1));

    /* Enable external XTAL 12MHz clock */
    CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk);

    /* Waiting for external XTAL clock ready */
    CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk);

    /* Set core clock as PLL_CLOCK from PLL */
    CLK_SetCoreClock(PLL_CLOCK);

    /* Enable UART module clock */
    CLK_EnableModuleClock(UART0_MODULE);
//    CLK_EnableModuleClock(UART1_MODULE);

    /* Select UART module clock source */
    CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1));
//    CLK_SetModuleClock(UART1_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1));

    /*---------------------------------------------------------------------------------------------------------*/
    /* Init I/O Multi-function                                                                                 */
    /*---------------------------------------------------------------------------------------------------------*/

    /* Set P3 multi-function pins for UART0 RXD and TXD */
    SYS->P3_MFP &= ~(SYS_MFP_P30_Msk | SYS_MFP_P31_Msk);
    SYS->P3_MFP |= (SYS_MFP_P30_RXD0 | SYS_MFP_P31_TXD0);

    /* Set P1 multi-function pins for UART1 RXD and TXD */
//    SYS->P1_MFP &= ~(SYS_MFP_P12_Msk | SYS_MFP_P13_Msk);
//    SYS->P1_MFP |= (SYS_MFP_P12_RXD1 | SYS_MFP_P13_TXD1);

    /* Set P0 multi-function pins for UART1 RTS */
//    SYS->P0_MFP = SYS->P0_MFP & (~SYS_MFP_P01_Msk) | SYS_MFP_P01_RTS1;
               
//                SYS->P3_MFP = SYS->P3_MFP & (~SYS_MFP_P32_Msk) | SYS_MFP_P32_RTS1;
               


}

void UART0_Init()
{
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init UART                                                                                               */
    /*---------------------------------------------------------------------------------------------------------*/
    /* Reset UART0 module */
    SYS_ResetModule(UART0_RST);

    /* Configure UART0 and set UART0 Baudrate */
    UART_Open(UART0, 9600);
}

int32_t main(void)
{
                uint8_t i,j;
         uint32_t u32i;
    /* Unlock protected registers */
    SYS_UnlockReg();

    /* Init System, peripheral clock and multi-function I/O */
    SYS_Init();

    /* Lock protected registers */
    SYS_LockReg();

    /* Init UART0 for printf */
    UART0_Init();

    /* Init UART1 for testing */
//    UART1_Init();

    /*---------------------------------------------------------------------------------------------------------*/
    /* SAMPLE CODE                                                                                             */

        /*---------------------------------------------------------------------------------------------------------*/
//                 UART_EnableFlowCtrl(UART0);

//    /* Send 1k bytes data */
//    for(u32i = 0; u32i < 1024; u32i++)
//    {
//        /* Send 1 byte data */
//        UART_WRITE(UART0, u32i & 0xFF);

//        /* Wait if Tx FIFO is full */
//        while(UART_IS_TX_FULL(UART0));
//    }
//               
         /* Configure P1.2 as Output mode and P4.1 as Input mode */
//   GPIO_SetMode(P4, BIT2, GPIO_PMD_OUTPUT);
        while(1)
                {
                       
                          for(i=1;i<5;i++)
       {
             UART_Write(UART0, &i, 1);
//              j++;
              CLK_SysTickDelay(100000);
        }
                       
////                                printf("hello world\n");
//                         CLK_SysTickDelay(100000);
//                                my_RS485_9bitModeMaster();
////                                printf("\n\nUART Sample Program\n");
//                                for( i=0;i<0xFFFF;i++)
//                                {
//                                       
//                                }

                }
  


}




使用特权

评论回复
沙发
aksu|  楼主 | 2020-8-6 15:26 | 只看该作者
[14:55:55.703]收←◆7F 00
[14:55:55.801]收←◆3F 00
[14:55:55.901]收←◆7E 00
[14:55:56.002]收←◆1F 00
[14:55:56.102]收←◆7F 00
[14:55:56.201]收←◆3F 00
[14:55:56.301]收←◆7E 00
[14:55:56.402]收←◆1F 00
[14:55:56.502]收←◆7F 00
[14:55:56.601]收←◆3F 00
[14:55:56.702]收←◆7E 00
[14:55:56.802]收←◆1F 00
[14:55:56.901]收←◆7F 00
[14:55:57.001]收←◆3F 00
[14:55:57.102]收←◆7E 00
[14:55:57.202]收←◆1F 00
[14:55:57.301]收←◆7F 00
[14:55:57.401]收←◆3F 00
[14:55:57.502]收←◆7E 00
[14:55:57.602]收←◆1F 00
[14:55:57.701]收←◆7F 00
[14:55:57.801]收←◆3F 00
[14:55:57.902]收←◆7E 00
[14:55:58.002]收←◆1F 00
[14:55:58.101]收←◆7F 00
[14:55:58.202]收←◆3F 00
[14:55:58.302]收←◆7E 00
[14:55:58.401]收←◆1F 00
[14:55:58.501]收←◆7F 00
[14:55:58.602]收←◆3F 00
[14:55:58.702]收←◆7E 00

这是接收到的数据,为什么每次发送后面还有00很奇怪

使用特权

评论回复
板凳
jiekou001| | 2020-8-6 19:49 | 只看该作者
#define UART_WRITE(uart, u8Data)    ((uart)->THR = (u8Data))
然后你写的那个是什么玩意儿。。。这就是个8位的参数啊 。怎么弄个与预算,高位有啥,怎么让高位干掉了。

使用特权

评论回复
地板
jiekou001| | 2020-8-6 19:50 | 只看该作者
1024虽然是大于255,但是你搞1024个发送也没有多大意思啊,你DEBUG一下,看看那个00是什么时候出现。

使用特权

评论回复
5
huangcunxiake| | 2020-8-6 21:21 | 只看该作者
先参考官方的程序,或者干脆别修改,跑一下看看。

使用特权

评论回复
6
aksu|  楼主 | 2020-8-7 08:52 | 只看该作者
jiekou001 发表于 2020-8-6 19:50
1024虽然是大于255,但是你搞1024个发送也没有多大意思啊,你DEBUG一下,看看那个00是什么时候出现。 ...

uint32_t UART_Write(UART_T* uart, uint8_t *pu8TxBuf, uint32_t u32WriteBytes)
{
    uint32_t  u32Count, u32delayno;

    for(u32Count = 0; u32Count != u32WriteBytes; u32Count++)
    {
        u32delayno = 0;
        while((uart->FSR & UART_FSR_TE_FLAG_Msk) == 0)  /* Wait Tx empty and Time-out manner */
        {
            u32delayno++;
            if(u32delayno >= 0x40000000)
                return FALSE;
        }
        uart->THR = pu8TxBuf[u32Count];    /* Send UART Data from buffer */
    }

    return u32Count;

}





int32_t main(void)
{
                uint8_t i,j;
         uint32_t u32i;
    /* Unlock protected registers */
    SYS_UnlockReg();

    /* Init System, peripheral clock and multi-function I/O */
    SYS_Init();

    /* Lock protected registers */
    SYS_LockReg();

    /* Init UART0 for printf */
    UART0_Init();

    /* Init UART1 for testing */
//    UART1_Init();

    /*---------------------------------------------------------------------------------------------------------*/
    /* SAMPLE CODE                                                                                             */

        /*---------------------------------------------------------------------------------------------------------*/

         /* Configure P1.2 as Output mode and P4.1 as Input mode */
   GPIO_SetMode(P3, BIT2, GPIO_PMD_OUTPUT);
         P32 = 1;

               
        while(1)
                {
                       
                          for(i=1;i<5;i++)
       {
             UART_Write(UART0, &i, 1);
//              j++;
//                                                UART_WRITE(UART0, MATCH_ADDRSS1);
//                                                my_RS485_SendAddressByte(MATCH_ADDRSS1);
              CLK_SysTickDelay(100000);
        }
                       
                }
    /* UART RS485 sample master function */
//    RS485_9bitModeMaster();
}


调试程序比较乱,我简化了一下主程序,其实就是一直发1、2、3、4,串口出来的数据就是上面那样,我仿真到这里后(  uart->THR = pu8TxBuf[u32Count];)串口数据就是上面那样   

使用特权

评论回复
7
aksu|  楼主 | 2020-8-7 08:59 | 只看该作者
jiekou001 发表于 2020-8-6 19:49
#define UART_WRITE(uart, u8Data)    ((uart)->THR = (u8Data))
然后你写的那个是什么玩意儿。。。这就是 ...

int32_t main(void)
{
                uint8_t i,j;
         uint32_t u32i;
    /* Unlock protected registers */
    SYS_UnlockReg();

    /* Init System, peripheral clock and multi-function I/O */
    SYS_Init();

    /* Lock protected registers */
    SYS_LockReg();

    /* Init UART0 for printf */
    UART0_Init();

    /* Init UART1 for testing */
//    UART1_Init();

    /*---------------------------------------------------------------------------------------------------------*/
    /* SAMPLE CODE                                                                                             */

        /*---------------------------------------------------------------------------------------------------------*/

         /* Configure P1.2 as Output mode and P4.1 as Input mode */
   GPIO_SetMode(P3, BIT2, GPIO_PMD_OUTPUT);
         P32 = 1;

               
        while(1)
                {
                       
                          for(i=1;i<5;i++)
       {
             UART_Write(UART0, &i, 1);

              CLK_SysTickDelay(100000);
        }
                       
                }

}


主程序比较乱,我简化一下,发送是 UART_Write(UART0, &i, 1);其实就是一直在发1、2、3、4

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

12

帖子

0

粉丝