YangHY 发表于 2026-2-27 20:29:29

首先模式改成可变波特率的9位方式:

YangHY 发表于 2026-2-27 20:37:40

我们直接用STC的ISP工具:

自动生成代码

YangHY 发表于 2026-2-27 20:40:16

void Uart2_Init(void)        //9600bps@24.000MHz
{
               

        P_SW2 |= 0x01;                                                //UART2/USART2: RxD2(P4.6), TxD2
       
        S2CON = 0xD0;                //9位数据,可变波特率
        AUXR |= 0x04;                //定时器时钟1T模式
        T2L = 0x8F;                        //设置定时初始值
        T2H = 0xFD;                        //设置定时初始值
        AUXR |= 0x10;                //定时器2开始计时
        IE2 |= 0x01;                //使能串口2中断
       
        Rec_Num = 0;
        B_TX2_Busy = 0;
}

接着改接收数据部分:

YangHY 发表于 2026-2-27 20:49:17

void Uart2_SendStr( u8 *puts )                //串口数据发送函数
{
        u8 dat;
    for (; *puts != 0;puts++)   //遇到停止符0结束
    {
                dat = *puts;
                ACC = dat;
                if( P )
                        S2TB8 = 0;
                else
                        S2TB8 = 1;
               
      S2BUF = dat;
      B_TX2_Busy = 1;
      while(B_TX2_Busy);
    }       
}

这里的if(P) 实际就是if(S2RB8) ,S2RB8 这是接收到的第9位数据

原来是if(S2RBB==(!P)) 就是奇校验(第9位和前面8位加起来刚好取反)

就是奇校验成立,那就保存接收到是数据:

if (S2CON & 0x01)        //检测串口2接收中断
        {
                S2CON &= ~0x01;        //清除串口2接收中断请求位
               
                dat = S2BUF;
                ACC = dat;
               
                //S2BUF
                if( S2RB8 == (!P))        //奇校验,P是奇偶校验位
                        Rec_Dat = dat;
        }


YangHY 发表于 2026-2-27 20:53:32

发送的时候也要处理一下:

void Uart2_SendStr( u8 *puts )                //串口数据发送函数
{
        u8 dat;
    for (; *puts != 0;puts++)   //遇到停止符0结束
    {
                dat = *puts;
                ACC = dat;
                if( P )
                        S2TB8 = 0;
                else
                        S2TB8 = 1;
               
      S2BUF = dat;
      B_TX2_Busy = 1;
      while(B_TX2_Busy);
    }       
}

要看懂这几句是处理第9位数据:
if( P )
                        S2TB8 = 0;//第9位数据为0
                else
                        S2TB8 = 1; //第9位数据为1

YangHY 发表于 2026-2-27 20:56:49

编译下载后,先试一下无校验
没有任何反应

改成奇校验:我们再发送一下数据


YangHY 发表于 2026-2-27 20:57:44

串口助手发送OPEN:

YangHY 发表于 2026-2-27 21:02:41

串口通信的超时中断
当我们在做串白接收的程序的时候,往往需要当接收到一串数据的时候需要及时的响应。但是响应的第一步就是我们得先判断这一包数据是否已经接收完成,必须要接收完成了才能进行下一步动作;

超时中断是用的非常多的

一包数据是否结束,要么有回车,要么时间超时

YangHY 发表于 2026-2-27 21:04:28

很多方法比较,最好还是超时:

YangHY 发表于 2026-2-27 21:05:50

看看超时中断相关寄存器:

页: 91 92 93 94 95 96 97 98 99 100 [101] 102 103 104
查看完整版本: 第一课 序言《AI8051U的特点》