找回密码
 立即注册
楼主: fanpu

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

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6843

积分

论坛元老

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

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

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:161
  • 最近打卡:2025-05-01 18:53:09
已绑定手机

10

主题

42

回帖

497

积分

中级会员

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

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

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:161
  • 最近打卡:2025-05-01 18:53:09
已绑定手机

10

主题

42

回帖

497

积分

中级会员

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

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

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:161
  • 最近打卡:2025-05-01 18:53:09
已绑定手机

10

主题

42

回帖

497

积分

中级会员

积分
497
发表于 2024-3-7 14:22:22 | 显示全部楼层
5533*** 发表于 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);        //等待发送完成
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-04-23 15:28:46

19

主题

65

回帖

223

积分

等待验证会员

积分
223
发表于 2024-3-8 09:54:34 | 显示全部楼层
fan*** 发表于 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;就应该没问题
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:161
  • 最近打卡:2025-05-01 18:53:09
已绑定手机

10

主题

42

回帖

497

积分

中级会员

积分
497
发表于 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, 2025-5-2 13:23 , Processed in 0.159912 second(s), 85 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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