- 打卡等级:偶尔看看I
- 打卡总天数:13
- 最近打卡:2025-01-27 23:56:26
注册会员
- 积分
- 114
|
关于使用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库函数原码上进行添加,如有不妥,联系删除
|
|