找回密码
 立即注册
查看: 860|回复: 2

STC32G12K128 Uart2 根据STC8H做奇偶校验时,发数据卡死发送函数

[复制链接]
  • 打卡等级:常住居民II
  • 打卡总天数:86
  • 最近打卡:2025-04-28 11:10:46

12

主题

44

回帖

558

积分

高级会员

积分
558
发表于 2023-6-30 08:49:50 | 显示全部楼层 |阅读模式
本帖最后由 jacksonjim 于 2023-6-30 08:57 编辑

STC32G12K128 Uart2 根据STC8H示例做奇偶校验时,发数据卡死发送函数;中断接收正常
测试uart参数为 偶校验,115200

主要关键代码如下


#define UART2_EVEN


void Uart2_init(u8 mode, u32 baudRate)
{
    u32 brt = 0;
    S2CON = (S2CON & 0x3f) | mode; // 模式设置
#if defined(UART2_EVEN) || defined(UART2_ODD)
    S2CON |= (1 << 7); // 1位起始位, 8位数据, 1位校验位, 1位停止位
#endif
    if (mode == UART_9bit_BRTx || mode == UART_8bit_BRTx)
    {
        brt = UART_BAUD_RATE(baudRate);
        T2R = 0;   // Timer stop
        S1BRT = 1; // S1 BRT Use Timer2;
        T2_CT = 0; // Timer2 set As Timer
        T2x12 = 1; // Timer2 set as 1T mode
        T2H = (u8)(brt >> 8);
        T2L = (u8)brt;
        T2R = 1; // Timer run enable

        UART2_RxEnable(ENABLE); // UART接收使能
    }
}



void UART2_ISR_Handler(void) INTERRUPT(UART2_VECTOR)
{
    BYTE dat;

    if (S2TI)
    {
        CLR_TI2();
        Uart2_TX_busy = 0;
    }

    if (S2RI)
    {
        CLR_RI2();
        dat = S2BUF;
#if defined(UART2_EVEN) || defined(UART2_ODD)
        if (S2CON & S2RB8)
            B_RxParity2 = 1;
        else
            B_RxParity2 = 0;
#endif
        uart2_buf[uart2_RxWptr = dat;
        uart2_time = UART_TIME;

    }
}

void UART2_send(const u8 dat)
{
    bit chk = 0;
    Uart2_TX_busy = 1;
#if defined(UART2_EVEN) || defined(UART2_ODD)
    ACC = dat;
#ifdef UART2_ODD // 奇校验
    chk = P;
#endif // UART2_ODD

#ifdef UART2_EVEN
    chk = !P; // 偶校验
#endif        // UART2_EVEN
    if (chk)
    {
        S2CON |= S2TB8;
    }
    else
    {
         S2CON &= ~S2TB8;
    }

#endif // UART2_EVEN UART2_ODD
    S2BUF = dat;
    while (Uart2_TX_busy)
        ;
}



void main()
{
    sys_init();
    Uart2_init(UART_8bit_BRTx, 115200);
}






后面注释掉这部分代码能正常发出数据
  1. if (chk)
  2. {
  3. S2CON |= S2TB8;
  4. }
  5. else
  6. {
  7. S2CON &= ~S2TB8;
  8. }
复制代码
目前原因不知道是什么,麻烦帮分析下看下具体是什么原因引起,谢谢
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:20
  • 最近打卡:2025-04-28 16:56:43

21

主题

376

回帖

2345

积分

超级版主

积分
2345
发表于 2023-6-30 13:51:08 | 显示全部楼层
附件有范例,测试下看看:

11-串口2中断模式与电脑收发测试.rar

16.97 KB, 下载次数: 76

电话:0513-55012946 QQ:2195591714  微信:  19952583740
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:86
  • 最近打卡:2025-04-28 11:10:46

12

主题

44

回帖

558

积分

高级会员

积分
558
发表于 2023-6-30 17:41:21 | 显示全部楼层
STC32G12*** 发表于 2023-6-30 13:51
附件有范例,测试下看看:

没有关于奇偶校验的发送数据部分,我查看下代码相关的部分,奇偶校验不是要做ACC=dat; S2CON|=S2TB8 之类 的操作嘛,你这个示例中没有对应的,还是说不需要?
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 20:46 , Processed in 0.140554 second(s), 61 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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