xuminghua 发表于 2023-12-25 16:04:22

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

无校验时一切正常,不会出现丢帧或错误现象,只有在奇校验或偶校验才会出现
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 = 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 = 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);      //等待发送完成
}






乘风飞扬 发表于 2023-12-26 11:50:55

本帖最后由 乘风飞扬 于 2023-12-26 11:52 编辑

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

xuminghua 发表于 2023-12-26 14:47:43

乘风飞扬 发表于 2023-12-26 11:50
STC32G支持硬件奇偶校验,不需要使用软件手动计算校验位

接收也不需要么?

xuminghua 发表于 2023-12-26 15:24:40

已经解决谢谢!
页: [1]
查看完整版本: STC32G12K128通讯奇偶校验出错问题请教 | 已解决