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

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

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:43
  • 最近打卡:2025-04-26 14:52:56

1

主题

2

回帖

197

积分

注册会员

积分
197
发表于 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





回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6843

积分

论坛元老

积分
6843
发表于 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
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:43
  • 最近打卡:2025-04-26 14:52:56

1

主题

2

回帖

197

积分

注册会员

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

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

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:43
  • 最近打卡:2025-04-26 14:52:56

1

主题

2

回帖

197

积分

注册会员

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

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-3 00:51 , Processed in 0.133600 second(s), 70 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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