吃了只脆皮鸡 发表于 2024-7-31 18:20:06

STC32G库函数使用串口奇偶校验位

关于使用STC32G串口的库函数时,需要奇偶校验位的,但是库函数并没有对奇偶校验的支持,在这里我根据个人的使用习惯,

STC32G_UART.h
STC32G_UART.c
STC32G_UART_isr.c
文件做了适当修改,首先是H文件,

添加了如下代码:

/****以下是个人添加的代码******/
/* 在使用奇偶校验的时候,必须要配置串口为9位数据位,使用哪个校验,就把 0 改为 1 ,如果不使用请保持为 0*/
#define COM1_ODD0 //奇校验
#define COM1_EVEN 0 //偶校验

#define COM2_ODD0 //奇校验
#define COM2_EVEN 1 //偶校验

#define COM3_ODD0 //奇校验
#define COM3_EVEN 0 //偶校验

#define COM4_ODD0 //奇校验
#define COM4_EVEN 0 //偶校验
/********************************/


bit Check_ODD(uint8_t Dat);//奇校验
bit Check_EVEN(uint8_t Dat); //偶校验


接下来是c文件中添加的代码,两个代码是一样的,只是返回值不同,为了方便区分,还是分成了两个函数


bit Check_ODD(uint8_t Dat)//奇校验
{
        uint8_t i=0;
        uint8_t eNum=0;
        for(i=0;i<8;i++)
        {
                if(Dat&0x01)eNum++;
                Dat>>=1;
        }
        if(eNum&0x01) return 0;
        else          return 1;
}
bit Check_EVEN(uint8_t Dat) //偶校验
{
        uint8_t i=0;
        uint8_t eNum=0;
        for(i=0;i<8;i++)
        {
                if(Dat&0x01)eNum++;
                Dat>>=1;
        }
        if(eNum&0x01) return 1;
        else          return 0;
}


下面是中断c文件的修改
这是串口1中断的,直接插入到TI中断中

        if(TI)
        {
                TI = 0;
               
                if(COM1.TX_send != COM1.TX_write)
                {
                       
/*******个人添加的奇偶校验实现**********/                       
#if COM1_ODD        //奇校验
                        TB8 = Check_ODD(TX1_Buffer);
#elif COM1_EVEN
                        TB8 = Check_EVEN(TX1_Buffer);
#endif
/*******************************/
                       
                       SBUF = TX1_Buffer;
                        if(++COM1.TX_send >= COM_TX1_Lenth)                COM1.TX_send = 0;
                }
                else        COM1.B_TX_busy = 0;
        }


这是串口2的

        if(S2TI)
        {
                CLR_TI2();
               
                if(COM2.TX_send != COM2.TX_write)
                {
/*******个人添加的奇偶校验实现**********/
#if COM2_ODD        //奇校验
                        S2TB8 = Check_ODD(TX2_Buffer);
#elif COM2_EVEN
                        S2TB8 = Check_EVEN(TX2_Buffer);
#endif
/**************************************/                       
                       S2BUF = TX2_Buffer;
                        if(++COM2.TX_send >= COM_TX2_Lenth)                COM2.TX_send = 0;
                }
                else        COM2.B_TX_busy = 0;
        }


串口3 4 同串口2,只需要修改S2TB8为S3TB8和S4TB8就行,

记得,使用奇偶校验位,串口初始化时候一定要把数据位定义为9位
如下:

        COMx_InitStructure.UART_Mode      = UART_9bit_BRTx;                //模式,   UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTx
//        COMx_InitStructure.UART_BRT_Use   = BRT_Timer2;                        //选择波特率发生器, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2, 所以不用选择)
        COMx_InitStructure.UART_BaudRate= 9600ul;                        //波特率,   110 ~ 115200
        COMx_InitStructure.UART_RxEnable= ENABLE;                                //接收允许,   ENABLE或DISABLE
        UART_Configuration(UART2, &COMx_InitStructure);                  //初始化串口2 UART1,UART2,UART3,UART4
        NVIC_UART2_Init(ENABLE,Priority_1);                //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3


以上代码均为个人使用,是在STC32G库函数原码上进行添加,如有不妥,联系删除


artherpc 发表于 2025-1-16 22:41:30

太牛了!!
页: [1]
查看完整版本: STC32G库函数使用串口奇偶校验位