找回密码
 立即注册
楼主: fa***

STC32G128K 串口4 如何设置校验位 | 已解决

[复制链接]
  • TA的每日心情
    奋斗
    3 小时前
  • 签到天数: 127 天

    [LV.7]常住居民III

    26

    主题

    1280

    回帖

    3983

    积分

    论坛元老

    积分
    3983
    发表于 2024-3-7 11:32:05 | 显示全部楼层
    fanpu 发表于 2024-3-7 08:44
    移植后还是不行

    前面4楼已经更新增加了移植到STC32平台的例子
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    3 小时前
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    5

    主题

    32

    回帖

    113

    积分

    注册会员

    积分
    113
     楼主| 发表于 2024-3-7 12:30:24 | 显示全部楼层
    王昱顺 发表于 2024-3-7 09:14
    P是偶校验位,如果不行可以尝试在acc操作后插入三个nop试试

    好的,我试下
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    3 小时前
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    5

    主题

    32

    回帖

    113

    积分

    注册会员

    积分
    113
     楼主| 发表于 2024-3-7 12:31:25 | 显示全部楼层
    乘风飞扬 发表于 2024-3-6 19:40
    附件是串口4+校验位与电脑收发测试,STC8系列平台、STC32平台的例子,供参考。 ...

    谢谢,我再试下
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    3 小时前
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    5

    主题

    32

    回帖

    113

    积分

    注册会员

    积分
    113
     楼主| 发表于 2024-3-7 14:22:22 | 显示全部楼层
    55337575 发表于 2024-3-7 11:27
    参考我的这个帖子吧。https://www.stcaimcu.com/forum.php?mod=viewthread&tid=6088

    还是不行呀
    void Uart4_Init(void)        //9600bps@33.1776MHz
    {
            S4CON = 0x90;                //9位数据,可变波特率
            S4CON |= 0x08;        //校验位初始值为 1
            S4CON |= 0x40;                //串口4选择定时器4为波特率发生器
            T4T3M |= 0x20;                //定时器时钟1T模式
            T4L = 0xA0;                        //设置定时初始值
            T4H = 0xFC;                        //设置定时初始值
            T4T3M |= 0x80;                //定时器4开始计时
            IE2 |= 0x10;                //使能串口4中断
    }

    void        UART4_TxByte(unsigned char dat)
    {
            ACC = dat;
            if(P)
            {
                    S4CON |= 0x08;        //偶校验
            }
            else
            {
                    S4CON &= ~0x08;        //偶校验
            }
            S4BUF = dat;                //发一个字节
            B_TX4_Busy = 1;                //标志发送忙
            while(B_TX4_Busy);        //等待发送完成
    }
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-22 08:53
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    7

    主题

    37

    回帖

    251

    积分

    等待验证会员

    积分
    251
    发表于 2024-3-8 09:54:34 | 显示全部楼层
    fanpu 发表于 2024-3-7 14:22
    还是不行呀
    void Uart4_Init(void)        //9600bps@33.1776MHz
    {

    中断需要B_TX4_Busy=0.
    void U4_Isr() interrupt 18
    {
        if(S4TI)
        {
            S4TI=0;B_TX4_Busy=0;
        }
        if(S4RI)
        {
            S4RI=0;
        }
    }
    再确保EA=1;就应该没问题
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    3 小时前
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    5

    主题

    32

    回帖

    113

    积分

    注册会员

    积分
    113
     楼主| 发表于 2024-3-8 10:37:26 | 显示全部楼层
    找到问题了,是设备供电不足导致的3.3V压降到了2.6V导致设备无法工作,
    串口我用示波器做了图形对比,正确代码如下,感谢各位大佬的帮助

    void Uart4_Init(void)        //9600bps@33.1776MHz
    {
            S4CON = 0x90;                //9位数据,可变波特率
            S4CON |= 0x40;                //串口4选择定时器4为波特率发生器
            T4T3M |= 0x20;                //定时器时钟1T模式
            T4L = 0xA0;                        //设置定时初始值
            T4H = 0xFC;                        //设置定时初始值
            T4T3M |= 0x80;                //定时器4开始计时
            IE2 |= 0x10;                //使能串口4中断
    }

    void        UART4_TxByte(unsigned char dat)
    {
            ACC = dat;
            S4TB8=P ; //偶校验位  
            S4BUF = dat;                //发一个字节
            B_TX4_Busy = 1;                //标志发送忙
            while(B_TX4_Busy);        //等待发送完成
    }
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-4-29 12:12 , Processed in 0.061891 second(s), 48 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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