⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 comport.c

📁 单片机8051,用了串口缓冲区收发合一的方式,适合于半双工通信
💻 C
字号:
#include "common.h"

byte RTBuf[MAX_COM_BUF_SIZE];//串口缓冲区
fastram byte RTFlag,         //串口状态标志
             RTLen,          //串口数据长度
             RTPtr;          //串口收发指针

//串口发送
void ComSend()
{
  if(RTPtr < RTLen)          //数据未发完
  {
    WriteCom(RTBuf[RTPtr]);  //发送下一个字节
    RTPtr++;
  }
  else
  {
    StopComSend();           //停止发送
    RTFlag = 0;              //设置接收标志
  }
}

//串口接收
void ComReceive(byte dat)
{
  //正在处理数据中,不再接收
  if (RTFlag > 1)
  {
    return ;
  }

  if (RTFlag == 0)
  {
    if (dat == FRAMEHEAD)  //收到帧头
    {
      RTBuf[0] = FRAMEHEAD;
      RTPtr = 1;
      RTFlag = 1;
      RTLen = 5;
    }
    return ;
  }
  else
  {

    RTBuf[RTPtr] = dat;
    RTPtr++;
    if (RTPtr >= RTLen)//接收到足够数据
    {
      RTFlag = 2;
      return ;
    }
    if (RTPtr >= MAX_COM_BUF_SIZE)//意外处理命令超长

    {
      RTFlag = 0;
      return ;
    }
  }
  
}

//串口分析
void ComAnalyse()
{

  if(RTFlag != 2)return;
  if(RTBuf[2] != 0x35)
  {
    RTFlag = 0;
    return;
  }

  RTFlag = 3;
  switch(RTBuf[1])
  {
     case 0x31:
       P0 = 1;
       break;
     case 0x32:
       P0 = 2;
       break;
     case 0x33:
       P0 = 3;
       break;
     default:
       RTFlag = 0;
       return;
  }
  RTBuf[1] = RTBuf[1] + 0x80;
  RTBuf[5] = RTBuf[4] + 1;
  RTBuf[6] = RTBuf[4] + 2;
  RTBuf[7] = RTBuf[4] + 3;
  RTLen = 8;
  RTPtr = 0;
  LED = !LED;    //发送数据指示
  StartComSend();//启动发送
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -