蓝桥杯51串口接受与发送代码

文章讲述了串口通信中数据寄存器和RI/TI标志的应用,以及如何处理发送错误和固定长度数据接收的问题。提出在接收空闲时间判断中解决连续快速发送导致的接收错误,通过定时器中断实现串口接收状态管理。
摘要由CSDN通过智能技术生成

 注意搞清楚串口的数据寄存器和移位寄存器区别,TI和RI标志位是通过数据寄存器的状态来置位的,参考江科大的ppt。

unsigned char rx_buf[10];

/*----------------------------
发送串口数据
----------------------------*/
void SendData(unsigned char dat)
{
    while (busy);               //等待前面的数据发送完成
    busy = 1;
    SBUF = dat;                 //写数据到UART数据寄存器TDR
}

/*----------------------------
发送字符串
----------------------------*/
void SendString(char *s)
{
    while (*s)                  //检测字符串结束标志
    {
        SendData(*s++);         //发送当前字符
    }
}

/*----------------------------
UART 中断服务程序写法1
-----------------------------*/
void Uart() interrupt 4
{
    if (RI)  //接收完成 RDR空了,可以读了
    {
      RI = 0;                 //清除RI位
	  rx_buf[rx_cnt++]=SBUF;   //从RDR读数据
      if(rx_buf[rx_cnt-1]=='\n') //假设指令以\n结尾
	 {
	 	flag_uart=1;     //flag=1的时候就处理rx_buf里面接收的数据
 	 	rx_cnt=0;
	 }
    }
    if (TI) //发送完成 TDR空了,可以写了
    {
        TI = 0;                 //清除TI位
        busy = 0;               //清除标志
    }
}
/*----------------------------
UART 中断服务程序写法2
-----------------------------*/
void Uart() interrupt 4
{
    if (RI)  //接收完成 RDR空了,可以读了
    {
      RI = 0;                 //清除RI位
	  rx_buf[rx_cnt++]=SBUF;   //从RDR读数据
      if(rx_cnt==10) //假设接收数据是固定长度,10个
	 {
	 	flag_uart=1;
 	 	rx_cnt=0;
	 }
    }
    if (TI) //发送完成 TDR空了,可以写了
    {
        TI = 0;                 //清除TI位
        busy = 0;               //清除标志
    }
}

问题:若想接收的是固定长度的3个字节的数据,如果我们先发送了1个字节错误的a,接着又发了3字节正确的bcd,那么rx_buf数组里面的是abc,就去处理了,这时候是错误的指令,没办法接收bcd。

解决办法:串口接收闲时判断

  1. 在定时器中断里,对串口接收的空闲时间开始计时,如果到50ms,则情空rx_buf和rx_cnt;
  2. 在串口接收服务函数里,重置串口接收空闲计时。
  3. 原因:电脑端连续发送N个字节,那么2个字节之间的间隔小于50ms。
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值