找回密码
 立即注册
查看: 299|回复: 3

STC32G12K128通讯奇偶校验出错问题请教 | 已解决

[复制链接]
  • TA的每日心情
    开心
    6 天前
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    1

    主题

    2

    回帖

    41

    积分

    新手上路

    积分
    41
    发表于 2023-12-25 16:04:22 | 显示全部楼层 |阅读模式
    无校验时一切正常,不会出现丢帧或错误现象,只有在奇校验或偶校验才会出现
    void Begin_send(void)
    {
        unsigned char i;
            b485Send = 1;      //处于发送
            for(i=0; i<sendCount; i++)
                                            {
                                             TX1_write2buff(TX1_Buffer);
                                            }
            b485Send = 0;              //发送完后将485置于接收状态
        COM1.RX_Cnt = 0;   //清接收地址偏移寄存器
    }
    #ifdef UART1
    void UART1_ISR_Handler (void) interrupt UART1_VECTOR
    {
            u8 Status;
      bit Erchc;
            if(RI)
            {
                    RI = 0;
        Erchc=0;
                    //--------USART LIN---------------
                    Status = USARTCR5;
                    if(Status & 0x02)     //if LIN header is detected
                    {
                            B_ULinRX1_Flag = 1;
                    }

                    if(Status & 0xc0)     //if LIN break is detected / LIN header error is detected
                    {
                            COM1.RX_Cnt = 0;
                    }
                    USARTCR5 &= ~0xcb;    //Clear flag
                    //--------------------------------
                    if(Tx_Yan!=0)
               {
                       ACC = SBUF;
                             if (Tx_Yan == 1)
                                            Chc = ~P;                        //奇校验
                            else if (Tx_Yan == 2)
                                            Chc = P;                        //偶校验
                             if(Chc!=RB8)Erchc=1;
               }        
        if(Erchc==0)
        {                        
                            if(COM1.RX_Cnt >= COM_RX1_Lenth)        COM1.RX_Cnt = 0;
                            RX1_Buffer[COM1.RX_Cnt++] = SBUF;
                            COM1.RX_TimeOut = TimeOutSet1;
                    }
                    else COM1.RX_Cnt = 0;
            }

            if(TI)
            {
                    TI = 0;
                    COM1.B_TX_busy = 0;     //使用阻塞方式发送直接清除繁忙标志

            }
    }
    #endif

    /********************* UART1 函数 ************************/
    #ifdef UART1
    void TX1_write2buff(u8 dat)        //串口1发送函数
    {
    //    #if(UART_QUEUE_MODE == 1)
    //        TX1_Buffer[COM1.TX_write] = dat;        //装发送缓冲,使用队列式数据发送,一次性发送数据长度不要超过缓冲区大小(COM_TXn_Lenth)
    //        if(++COM1.TX_write >= COM_TX1_Lenth)        COM1.TX_write = 0;
    //        if(COM1.B_TX_busy == 0)                //空闲
    //        {  
    //               
    //               
    //                 if(Tx_Yan!=0)
    //                        {
    //                                ACC = dat;
    //                                if (Tx_Yan == 1)
    //                                                TB8 = P;                        //奇校验
    //                                else if (Tx_Yan == 2)
    //                                          TB8 = ~P;                        //偶校验
    //                        }               
    //                 COM1.B_TX_busy = 1;                //标志忙
    //                 TI = 1;                                        //触发发送中断
    //        }
    //    #else
    //    //以下是阻塞方式发送方法
    //        SBUF = dat;
    //        COM1.B_TX_busy = 1;                //标志忙
    //        while(COM1.B_TX_busy);
    //    #endif
    COM1.B_TX_busy = 1;                //标志发送忙
    SBUF = dat;        
    if(Tx_Yan!=0)
                    {
                            ACC = dat;
                            if (Tx_Yan == 1)
                                            TB8 = P;                        //奇校验
                            else if (Tx_Yan == 2)
                                            TB8 = ~P;                        //偶校验
                    }               
                            //发一个字节
            while(COM1.B_TX_busy);        //等待发送完成
    }
    截图202312251602409284.jpg





    回复 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    2 小时前
  • 签到天数: 145 天

    [LV.7]常住居民III

    27

    主题

    1360

    回帖

    4229

    积分

    论坛元老

    积分
    4229
    发表于 2023-12-26 11:50:55 | 显示全部楼层
    本帖最后由 乘风飞扬 于 2023-12-26 11:52 编辑

    STC32G支持硬件奇偶校验,不需要使用软件手动计算校验位
    1.     //串口1(模式3:可变波特率9位数据)
    2. //    USARTCR2 = 0x00;    //禁止硬件产生奇偶校验
    3. //    USARTCR2 = 0x04;    //使能硬件产生偶校验
    4.     USARTCR2 = 0x06;    //使能硬件产生奇校验
    5.     SCON = 0xd0;
    6.     T2L = BRT;
    7.     T2H = BRT >> 8;
    8.     AUXR = 0x15;
    复制代码

    截图202312261152097279.jpg
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    6 天前
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    1

    主题

    2

    回帖

    41

    积分

    新手上路

    积分
    41
     楼主| 发表于 2023-12-26 14:47:43 | 显示全部楼层
    乘风飞扬 发表于 2023-12-26 11:50
    STC32G支持硬件奇偶校验,不需要使用软件手动计算校验位

    接收也不需要么?
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    6 天前
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    1

    主题

    2

    回帖

    41

    积分

    新手上路

    积分
    41
     楼主| 发表于 2023-12-26 15:24:40 | 显示全部楼层
    已经解决谢谢!
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-21 11:19 , Processed in 0.059995 second(s), 43 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表