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

📄 communication_usart.c

📁 本程序是用于通用同步和异步串行接收器和转发器(USART)
💻 C
📖 第 1 页 / 共 4 页
字号:
                  是否有新的通讯接收数据需要处理,以决定下一步的处理操作。
              ③.出口参数:由于本函数为消息任务队列函数,因此,本函数在调用时,将在函数体中
                            隐式修改下面这个出口参数的全局静态变量。
                  允许处理通讯发送数据(tcomm_sign0.tcomm_tdalw)=0,用以通知其它处理函数,
                  本中断函数己完成发送数据处理操作。
==========================================================================================*/
void USART0_TX_Data_Manage(void)
{
#if defined(USART_DATA_TO_FROM_EEPROM)        // 通信数据转储目的为EEPROM的条件编译
#if (USART0_TXBUF_SIZE < 256)
  unsigned char j;                            // 临时变量
#else
  unsigned int j;
#endif
#endif                                        // 通信数据转储目的条件编译结束
  if (tcomm_sign0.tcomm_tdalw == TCOMM_VVALUE)// 是否允许处理通讯发送数据?
  {
    switch (usart0_tx_data_times)
    {
      case 1 :
      {
        USART0_TX_COMM_Start(tcomm_com_tx_gdend);// 向对方发送“批发送数据结束”命令
        usart0_tx_data_times = 0x00;             // 每批发送数据次数置为0
        usart0_tx_counter = USART0_TXBUF_SIZE-5; // 发送数据个数=发送缓冲区长度-5
        usart0_tx_end_counter = 0x00;            // 最后一次的数据个数计数器置为0
        tcomm_sign0.tcomm_tdalw = 0x00;          // 清除允许处理通讯发送数据标志
        break;
      }
      case 2 :
      {
        if (usart0_tx_end_counter != 0)
        {                                     // 复制发送的数据序列到发送数据缓冲区
#if defined(USART_DATA_TO_FROM_EEPROM)        // 通信数据复制源为EEPROM的条件编译
          for (j=0; j<usart0_tx_end_counter; j++)
          {
            EEPROM_READ(usart0_tx_buffer[j], &usart0_tx_eepbuf[usart0_tx_eepbuf_index]);
            usart0_tx_eepbuf_index++;
            if (usart0_tx_eepbuf_index == USART0_TX_EEPBUF_SIZE)
            {
              usart0_tx_eepbuf_index = 0;     // 转储缓冲区数据地址索引变量归零
            }
          }
#elif defined(USART_DATA_TO_FROM_EXTSRAM)     // 通信数据复制源为大于 64 KB SRAM 条件编译
          ExtSRAM_Black_Read(usart0_tx_buffer, usart0_tx_end_counter);
#else                                         // 通信数据复制源条件编译
#error 函数  " USART0_TX_Data_Manage "  错误!函数体中没有发送数据复制源的执行部分。
#endif                                        // 通信数据复制源的条件编译结束
          usart0_tx_buffer[usart0_tx_end_counter] = 0x00;// 2位CRC码清为“$00,$O0”
          usart0_tx_end_counter++;
          usart0_tx_buffer[usart0_tx_end_counter] = 0x00;
          usart0_tx_end_counter++;
          DataCheck_CRC_2Bit(usart0_tx_buffer,usart0_tx_end_counter);// 产生带CRC码数据序列
          usart0_tx_buffer[usart0_tx_end_counter] = 0x0D;// 复制结束字符“0D”到发送数据缓冲区
          usart0_tx_end_counter++;
          usart0_tx_buffer[usart0_tx_end_counter] = 0x0A;// 复制结束字符“0A”到发送数据缓冲区
          usart0_tx_end_counter++;
          usart0_tx_buffer[usart0_tx_end_counter] = 0x17;// 复制结束字符“17”到发送数据缓冲区
          usart0_tx_end_counter++;
          usart0_tx_counter = usart0_tx_end_counter;
          usart0_tx_data_times--;             // 每批发送数据次数-1
          USART0_TX_COMM_Start(tcomm_com_ask_tx);// 向对方发送“请求发送数据”命令
        }
        else
        {
          USART0_TX_COMM_Start(tcomm_com_tx_gdend);// 向对方发送“批发送数据结束”命令
          usart0_tx_data_times = 0x00;             // 每批发送数据次数置为0
          usart0_tx_counter = USART0_TXBUF_SIZE-5; // 发送数据个数=发送缓冲区长度-5
          usart0_tx_end_counter = 0x00;            // 最后一次的数据个数计数器置为0
        }
        tcomm_sign0.tcomm_tdalw = 0x00;       // 清除允许处理通讯发送数据标志
        break;
      }
      default:
      {                                       // 复制发送的数据序列到发送数据缓冲区
#if defined(USART_DATA_TO_FROM_EEPROM)        // 通信数据复制源为EEPROM的条件编译
        for (j=0; j<usart0_tx_counter; j++)
        {
          EEPROM_READ(usart0_tx_buffer[j], &usart0_tx_eepbuf[usart0_tx_eepbuf_index]);
          usart0_tx_eepbuf_index++;
          if (usart0_tx_eepbuf_index == USART0_TX_EEPBUF_SIZE)
          {
            usart0_tx_eepbuf_index = 0;       // 转储缓冲区数据地址索引变量归零
          }
        }
#elif defined(USART_DATA_TO_FROM_EXTSRAM)     // 通信数据复制源为大于 64 KB SRAM 条件编译
        ExtSRAM_Black_Read(usart0_tx_buffer, usart0_tx_counter);
#else                                         // 通信数据复制源条件编译
#error 函数  " USART0_TX_Data_Manage "  错误!函数体中没有发送数据复制源的执行部分。
#endif                                        // 通信数据复制源的条件编译结束
        usart0_tx_buffer[usart0_tx_counter] = 0x00;// 2位CRC码清为“$00,$O0”的校验数据值
        usart0_tx_counter++;
        usart0_tx_buffer[usart0_tx_counter] = 0x00;
        usart0_tx_counter++;
        DataCheck_CRC_2Bit(usart0_tx_buffer,usart0_tx_counter);// 产生带2位CRC码数据序列
        usart0_tx_buffer[usart0_tx_counter] = 0x0D;// 复制结束字符“0D”到发送数据缓冲区
        usart0_tx_counter++;
        usart0_tx_buffer[usart0_tx_counter] = 0x0A;// 复制结束字符“0A”到发送数据缓冲区
        usart0_tx_counter++;
        usart0_tx_buffer[usart0_tx_counter] = 0x17;// 复制结束字符“17”到发送数据缓冲区
        usart0_tx_counter++;
        usart0_tx_data_times--;               // 每批发送数据次数-1
        tcomm_sign0.tcomm_tdalw = 0x00;       // 清除允许处理通讯发送数据标志
        USART0_TX_COMM_Start(tcomm_com_ask_tx);// 向对方发送“请求发送数据”命令
      }
    }
  }
}

/*==========================================================================================
函数功能:    本函数用于USART0异步通信进行发送各类批次发送数据通讯作业函数。
              在本函数中除了将发送的数据序列复制到发送数据缓冲区内,还将生成发送数据序列的
              2位监督码(CRC码)和通讯任务结束字符“0D、0A、17”,发送数据时,这5位
              数据将接在数据序列尾部一同发送出去。
备注:        ①.注意:本函数为消息任务队列函数,要在主函数中不间断循环调用运行。
              ②.入口参数:由于本函数为消息任务队列函数,因此,本函数在调用时,将在函数体中
                            隐式调用通讯处理消息任务标志变量的下面这个入口参数的全局静态变量。
                  允许批次处理通讯发送数据(tcomm_sign0.tcomm_tdgrp)=TCOMM_VVALUE,用以判断
                  是否有新批次的通讯接收数据需要处理,以决定下一步的处理操作。
              ③.出口参数:由于本函数为消息任务队列函数,因此,本函数在调用时,将在函数体中
                            隐式修改下面这个出口参数的全局静态变量。
                  允许批次处理通讯发送数据(tcomm_sign0.tcomm_tdgrp)=0,用以通知其它
                  处理函数,本中断函数己完成发送数据处理操作。
              ④.本批发送数据次数置为1:用于判断方便,预留批发送数据次数=0,给单次发送
                  数据使用。当批发送数据次数为0时,可发送单次数据;当为1时,本批发送数据
                  任务即已完成。
              ⑤.发送数据个数计数器等于发送数据缓冲区长度,减去2个CRC校验数据码和3个
                  发送信息组传送结束符。
==========================================================================================*/
void USART0_TX_GroupData_Manage(void)
{
#if defined(USART_DATA_TO_FROM_EEPROM)        // 通信数据复制源为EEPROM的条件编译
  unsigned int temp;                          // 临时变量
#endif                                        // 通信数据复制源的条件编译结束
  if (tcomm_sign0.tcomm_tdgrp == TCOMM_VVALUE)// 是否允许批次处理通讯发送数据?
  {
    usart0_tx_data_times = 0x01;              // 本批发送数据次数置为1,用于判断方便
#if defined(USART_DATA_TO_FROM_EEPROM)        // 通信数据复制源为EEPROM的条件编译
    temp = USART0_TX_EEPBUF_SIZE;
    while (temp > (unsigned int)(USART0_TXBUF_SIZE))
    {
      usart0_tx_data_times++;                 // 本批发送数据次数+1
      temp = temp-USART0_TXBUF_SIZE;
    }
    usart0_tx_data_times++;                   // 本批发送数据次数+1
    usart0_tx_counter = USART0_TXBUF_SIZE-5;  // 发送数据个数计数器=缓冲区长度-5
    usart0_tx_end_counter = temp;             // 最后一次的数据个数计数器等于余数
#elif defined(USART_DATA_TO_FROM_EXTSRAM)     // 通信数据复制源为大于 64 KB SRAM 条件编译
    IN_all_data_start_size = EXTSRAM_ADDR_START;
    IN_all_data_end_size = EXTSRAM_ADDR_END;
    IN_all_data_h_start_size = EXTSRAM_ADDR_H_START;
    IN_all_data_h_end_size = EXTSRAM_ADDR_H_END;
    usart0_tx_data_times = EXTSRAM_Data_Access_Times(es_addr_read_h_index, \
                                                     es_addr_write_h_index, \
                                                     es_addr_read_index, \
                                                     es_addr_write_index, \
                                                     (USART0_TXBUF_SIZE-5));
    usart0_tx_counter = USART0_TXBUF_SIZE-5;  // 发送数据个数计数器=缓冲区长度-5
    usart0_tx_end_counter = OUT_data_size_remainder;
#else                                         // 通信数据复制源条件编译
#error 函数  " USART0_TX_GroupData_Manage "  错误!函数体中缺少计算批次数的执行部分。
#endif                                        // 通信数据复制源的条件编译结束
  }
  tcomm_sign0.tcomm_tdgrp = 0x00;             // 清除允许批次处理通讯发送数据标志
}

/*==========================================================================================
函数功能:    本函数是USART0异步通信接收和发送作业不间断循环调用运行函数。
备注:        注意:本函数为消息任务队列函数,要在主函数中不间断循环调用运行。
==========================================================================================*/
void USART0_Circle_Function(void)
{
  USART0_RX_COMM_Manage();
  USART0_RX_Data_Manage();
  USART0_TX_GroupData_Manage();
  USART0_TX_Data_Manage();
}



/*
********************************************************************************************
                                 本C语言源程序文件到此结束
********************************************************************************************
*/

⌨️ 快捷键说明

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