找回密码
 立即注册
查看: 343|回复: 1

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

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2025-01-27 23:56:26

6

主题

12

回帖

114

积分

注册会员

积分
114
发表于 2024-7-31 18:20:06 | 显示全部楼层 |阅读模式
关于使用STC32G串口的库函数时,需要奇偶校验位的,但是库函数并没有对奇偶校验的支持,在这里我根据个人的使用习惯,

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

添加了如下代码:

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

#define COM2_ODD  0 //奇校验
#define COM2_EVEN 1 //偶校验

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

#define COM4_ODD  0 //奇校验
#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[COM1.TX_send]);
#elif COM1_EVEN
                        TB8 = Check_EVEN(TX1_Buffer[COM1.TX_send]);
#endif
/*******************************/
                       
                         SBUF = TX1_Buffer[COM1.TX_send];
                        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[COM2.TX_send]);
#elif COM2_EVEN
                        S2TB8 = Check_EVEN(TX2_Buffer[COM2.TX_send]);
#endif
/**************************************/                       
                         S2BUF = TX2_Buffer[COM2.TX_send];
                        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库函数原码上进行添加,如有不妥,联系删除


回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2024-12-06 14:04:35

0

主题

1

回帖

36

积分

新手上路

积分
36
发表于 2025-1-16 22:41:30 | 显示全部楼层
太牛了!!
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 02:21 , Processed in 0.145807 second(s), 54 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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