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

📄 task_transdata.c

📁 small RTOS 嵌入式实时多任务开发
💻 C
字号:


#include "config.h"

static volatile uint8 data SendTimes=1,FrameID=0;  //只限本文件内使用的静态外部变量
static volatile uint8 data AckResult=_ERROR;
static volatile uint8 data TimeExpire=OS_Q_TMO;
static volatile uint8 data EndFlag;


void Task_TransData(void)
{
 uint8 (*p_data)[_DataWidth]=SendData,i;
 
 while(1)
  {
    OSWait(K_SIG,0);
    FrameID=0;
    for(i=0;i<_DataWidth;i++,p_data++)
      {
        SendTimes = 1; AckResult = _ERROR; EndFlag=_STARTBYTE1;
        // 0x08表示是本次传输的最后一帧(ControlByte.LastFrame=TRUE)
        if(EndFlag==_END) FrameType = (_DataFrame|0x08)+FrameID; 
        else  FrameType = _DataFrame+FrameID;
        EndFlag = _END;
        do
         {
           Transmit(DesAddr,p_data,FrameType);
           TimeExpire=OSQPend(&AckResult,AckInBuf,3);
         }while((TimeExpire==OS_Q_TMO || AckResult==_ERROR) && (++SendTimes)<=3);
        PutChar(AckResult);  // 应答结果送到PC上
        FrameID++;
        if(AckResult==_ERROR) 
          { _TURN_ON_WRONG; break; }  //说明无法进行通信
        else  _TURN_ON_RIGHT;
      } //for(;;) 
  }// while(1)
} 

/*void Task_TransData(void)
{
 uint8 data head1,head2;
 
 OSQCreate(SerialInBuf,SendBuf);
 while(1)
  {
    OSQPend(&head1,SerialInBuf,0);          // 等待从UART口接收一个字节         
        while (1)
        {
            OSQPend(&head2,SerialInBuf,0);     // 接收一个字节         
            if ((head1 == _STARTBYTE1) && (head2 == _STARTBYTE2))
            {
                break;                          // 接收到起始字符       
            }
            head1 = head2;//不是起始帧头,重新开始接收(忽略已经收到的字节)
        }
    OSQPend(&DesAddr,SerialInBuf,0); 
    FrameID=0;
    do
     {
       for(DataCnt=0;DataCnt<_DataWidth;DataCnt++)
         { OSQPend(SendData+DataCnt,SerialInBuf,0); }
       OSQPend(&EndFlag,SerialInBuf,0);
       SendTimes = 1; AckResult = _ERROR; 
       // 0x08表示是本次传输的最后一帧(ControlByte.LastFrame=TRUE)
       if(EndFlag==_END) FrameType = (_DataFrame|0x08)+FrameID; 
       else  FrameType = _DataFrame+FrameID;
       do
        {
          Transmit(DesAddr,FrameType);
          TimeExpire=OSQPend(&AckResult,AckInBuf,3);
        }while((TimeExpire==OS_Q_TMO || AckResult==_ERROR) && (++SendTimes)<=3);
       PutChar(AckResult);  // 应答结果送到PC上
       FrameID++;
       if(AckResult==_ERROR)  break;  //说明无法进行通信
     }while(EndFlag != _END);  // 表明本次向目标方发送数据的任务完成了(一次可发送N帧数据(N<=8))
  }// while(1)
} */

⌨️ 快捷键说明

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