找回密码
 立即注册
查看: 243|回复: 4

串口程序 中断方式

[复制链接]
  • 打卡等级:常住居民II
  • 打卡总天数:87
  • 最近打卡:2025-04-30 09:11:54
已绑定手机

12

主题

56

回帖

367

积分

中级会员

积分
367
发表于 2025-2-20 11:46:25 | 显示全部楼层 |阅读模式

#include "STC15W4K.H"
#define  TRUE    1
#define  FALSE   0

volatile unsigned char Flag=FALSE;
unsigned char uart1temp;

void UART_init(void)
{                  
        // 下面代码设置定时器1
        TMOD = 0x20;        // 0010 0000 定时器1工作于方式2(8位自动重装方式)
        TH1  = 0xFA;        // 波特率:9600 /22.1184MHZ
        TL1  = 0xFA;        // 波特率:9600 /22.1184MHZ
        TR1  = 1;
        // 下面代码设置定串口
        AUXR = 0x00;             // 很关键,使用定时器1作为波特率发生器,S1ST2=0
        SCON = 0x50;         // 01010 0000 SM0.SM1=01(最普遍的8位通信),REN=1(允许接受)
                                // 下面代码设置中断
        ES   = 1;                // 关键:开启了中断就必须编写相应的中断函数,哪怕是中断空函数,
                               // 但必须有,否则程序进入中断入口地址后(这里是0023H)不能跳出,必然出错
        EA   = 1;
}

/***************************************************************************
* 描  述 : 串口1发送数据函数
* 入  参 : uint8 数据
* 返回值 : 无
**************************************************************************/
void SendDataByUart1(uint8 dat)
{
    SBUF = dat;                 //写数据到UART数据寄存器
                while(TI == 0);             //在停止位没有发送时,TI为0即一直等待
                TI = 0;                     //清除TI位(该位必须软件清零)
}

/***************************************************************************
* 描  述 : 串口1中断服务函数
* 入  参 : 无
* 返回值 : 无
**************************************************************************/
void Uart1() interrupt 4 using 1
{
        ES = 0;                            // 串口1中断关闭
        Flag=TRUE;                  //接收到数据,接收标识符有效
        if (RI)                     //串行接收到停止位的中间时刻时,该位置1
  {
      RI = 0;                 //清除RI位 (该位必须软件清零)
                        uart1temp = SBUF;      
   }
   if (TI)                    //在停止位开始发送时,该位置1
   {
      TI = 0;                 //清除TI位(该位必须软件清零)
   }
         ES =  1;                   // 串口1中断打开
}

/**************************************************************************************
* 描  述 : 串口1接收到数据后发送出去
* 入  参 : 无
* 返回值 : 无
**************************************************************************************/
void UART1_Tx_Puts(void)
{
  if(Flag)                //有新数据通过串口被接收到
        {       
                ES = 0;                                             //串口1中断关闭                  
    SendDataByUart1(uart1temp);       //发送字符
    SendDataByUart1(0x0D);            //发送换行符
    SendDataByUart1(0x0A);            //发送换行符                                               
                ES = 1;                                  //串口1中断打开                       
                Flag=FALSE;                       //清除接收标识符
  }
}

int main()
{
        P3M1 &= 0xFE;        P3M0 &= 0xFE;                          //设置P3.0为准双向口
        P3M1 &= 0xFD;        P3M0 |= 0x02;                          //设置P3.1为推挽输出
       
        UART_init();                              // 串口初始化
        EA = 1;               //总中断打开
       
        while(1)
        {
                UART1_Tx_Puts();   //串口接收到一个字符后返回该字符
        }
}

以上是用中断方式写的串口收发程序。
用串口助手发送数据给单片机,单片机接收到后再回PC。

个人认为只能收发1个字节的数据,经实验后发现如果去掉:
SendDataByUart1(0x0D);            //发送换行符
SendDataByUart1(0x0A);            //发送换行符       
这两条语句,可以一次性收发很多字节的数据,加上这两条语句后第三个字节的数据就会丢失,后面也会丢失其他字节。

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2025-2-20 12:28:44 | 显示全部楼层
可以看下我的串口收发框架:

https://www.stcaimcu.com/forum.php?mod=viewthread&tid=4598

注意状态和指针的处理,逻辑错误会导致各种异常

DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-04-29 08:28:25
已绑定手机

17

主题

446

回帖

1173

积分

金牌会员

积分
1173
发表于 2025-2-20 13:05:27 | 显示全部楼层
逻辑混乱,又是查询,又是中断,
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:87
  • 最近打卡:2025-04-30 09:11:54
已绑定手机

12

主题

56

回帖

367

积分

中级会员

积分
367
发表于 2025-2-20 16:23:42 | 显示全部楼层
Debu*** 发表于 2025-2-20 12:28
可以看下我的串口收发框架:

https://www.stcaimcu.com/forum.php?mod=viewthread&tid=4598

感谢大神指导
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:87
  • 最近打卡:2025-04-30 09:11:54
已绑定手机

12

主题

56

回帖

367

积分

中级会员

积分
367
发表于 2025-2-20 16:24:09 | 显示全部楼层
Ayb_*** 发表于 2025-2-20 13:05
逻辑混乱,又是查询,又是中断,

谢谢批评指正
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 04:29 , Processed in 0.173082 second(s), 72 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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