plsbackup 发表于 2025-3-28 08:00

单片机超时接收程序

#define MaxLen    255               //最大长度

u16 RecTimNum=0;                  //接收计时
FunctionalState RecStart=DISABLE;   //接收启动标志位
FunctionalState RecFinish=DISABLE;//接收完成标志位
u8 ReceiveBuf={0};          //接收缓冲区
u8 BufLen=0;                        //接收长度

/* 超时接收完成函数 定时器中断1ms进入一次 */
void Rec_TimOut(void)
{
    if(RecStart==ENABLE)
    {
      if(++RecTimNum==5)                  //5ms没有接收到数据默认接收完成
      {
            RecTimNum=0;                  //计时清零
            RecStart=DISABLE;               
            RecFinish=ENABLE;               //接收完成标志位置位
            //接收完成处理函数
            Uart_Send(ReceiveBuf,BufLen);   //本段为将接收到的数据重新发送回串口。回环测试

            BufLen=0;                     //长度清零
            RecFinish=DISABLE;            //接受完成
      }
    }
}

/* UART接收函数 放在串口接收中断*/
void Uart_Receive()
{
    u8 temp;
    if(RecStart==DISABLE)         //第一次进入串口中断
    {
      RecStart=ENABLE;            //接收启动标志
    }
    RecTimNum=0;                  //每次重新进入串口接收中断时,清零计数,表示还未接收完成
    temp = UART_ReceiveData8();    //从缓冲区取出数据
    ReceiveBuf=temp;      //接收缓冲区

}

wang6623 发表于 2025-3-31 13:41

你的代码逻辑已经基本清晰地实现了一个基于定时器的超时接收功能,通过判断串口数据接收超时来完成接收操作的终止,并且在超时后将接收到的数据发送回串口进行回环测试。

Amazingxixixi 发表于 2025-4-24 15:51

学习一下啊!感觉有点知识慌了

suw12q 发表于 2025-5-8 19:35

来学习学习,其实用超时接收可以很好的做不定长数据接收和处理的

zhizia4f 发表于 2025-5-8 19:39

之前用DMA做的,超时时间不好修改

w2nme1ai7 发表于 2025-5-8 20:43

你用的是软件超时接收是么

q1d0mnx 发表于 2025-5-8 21:50

这个比较灵活啊,时间还可以修改吧

p0gon9y 发表于 2025-5-8 23:17

我觉得这种比较合适,而且适合做4G这种交互数据通讯这种

t1ngus4 发表于 2025-5-9 08:02

这种会有丢数据的情况发生吗

y1n9an 发表于 2025-5-9 10:04

看起来不错,这种超时接收好像可以用在任何MCU上了

cen9ce 发表于 2025-5-9 13:15

话说,在这个超时时间里处理串口接收的数据就可以是么

d1ng2x 发表于 2025-5-9 14:31

看起来挺好的,这么做的话时间可以设置,可以保证一包完整的数据

kaif2n9j 发表于 2025-5-9 17:01

这种就不能有阻塞延时的操作吧,不然好像不太行

页: [1]
查看完整版本: 单片机超时接收程序