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

📄 communication_usart.c

📁 本程序是用于通用同步和异步串行接收器和转发器(USART)
💻 C
📖 第 1 页 / 共 4 页
字号:
/*
********************************************************************************************
源程序文件名:      Communication_USART.c
源程序名称:        通用同步异步接收发送器(USART)异步中断接收和发送通信源程序文件
程序版本:        1.0
程序功能:
    本程序是用于通用同步和异步串行接收器和转发器(USART),使用中断方式异步接收
  和发送数据通信源的程序文件。
程序说明:
    通信协议:
      ①.每次进行接收和发送的作业时均以协议命令来决定下一步操作方式,关于通信
    协议命令的约定方法请见下述详细说明和命令字符串的具体定义。接收和发送的命令
    的数据字节长度固定为 10 个字节,其格式定义如下:COM(命令起始标识字符串)+
    设备编号(4 个字节)+ 命令字(3 个字节)。
      ②.接收或发送数据的数据帧格式:“8 个数据位, 1 个停止位,使用奇校验”。
    注:如需更改数据帧格式可在“COMM_USART_initialization”函数中进行修改。
      ③.本程序约定双方通信的波特率为“ 57.6 Kbps ”。注:如需更改本程序的通
    信波特率可在“波特率(bps)常数定义”中进行设置,但双方通信的波特率受定时器/
    计数器0定时时间的约束,如果要修改最小双方通信波特率,则需修改定时器/计数器
    0的定时时间(减小最小波特率需延长定时时间,增大则缩短定时时间)。定时器/计
    数器0的定时时间应略大于在约定双方通信的波特率下接收完 255 个字节所用的时间
    总和,也不宜取得过大,过大则影响双方通信的速度。
      ④.接收和发送的数据时均以[命令>数据,命令>数据……]形式为作业方式进行
    通信,但接收和发送的命令时可以任意形式进行通信。对于接收和发送的数据的校验方
    法采用循环冗余检测(CRC)校验法,接收和发送的双方必须采用相同的校验算法,具
    体的检测校验算法请参考子程序“Data_CRC_2Byte”中的具体说明。
      ⑤.每次接收和发送的数据总长度均不超过 255 个字节。而且每次接收或发送数据
    的第一个字节为本次接收或发送的数据长度字符,最后两个字节为循环冗余检测校验字
    节,因此每次接收和发送的有效数据长度均不得超过 252 个字节。,其计算公式如下:
    数据长度数值 = 有效数据字节长度 + 3( 1 个长度字符本身 + 2 个校验字节)
      ⑥.在发送数据前要向对方先发送一请求发送数据命令字符串“COMXXXXATX”,等待
    对方回应一允许发送命令字符串“COMXXXXYET”的握手信号后,方可接着进行发送数据。
      ⑦.当接收到的数据或命令有错误时,可向对方发送要求重新发送命令字符串“CO
    MXXXXRPT”,要求对方重新发送。对方在接收到此命令字符串后,依据上次发送的作业
    类型来重新发送数据或命令。对于接收到的数据经循环冗余检测校验错误后,也可使用
    重新发送一次允许发送命令字符串“COMXXXXYET”来要求对方重新发送数据。
      ⑧.当接收到的数据(不包括命令)经循环冗余检测校验正确后,必须向对方发送
    一接收数据正确命令字符串“COMXXXXOKD”,来结束本次接收数据操作。如果对方不发
    送收到此命令字符串“COMXXXXOKD”错误的信息(即发回“COMXXXXRPT”),不允许多
    次发送此命令字符串,否则将导致接收数据错误。
      ⑨.本程序通信协议命令还包括了下面三个协议命令字符串,具体用法如下述:
    “COMXXXXSTD”[要求对方发送指定数据],此命令用于启动双方对指定数据的收发
    操作。
    “COMXXXXRII”[要求对方重新初始化 USART 端口状态],此命令用于当通信协议命令
    混乱,致使收发作业操作无法正常运行时,向对方发出从头再重新开始收发作业请求。
    此命令也可用于双方开始通信前向对方发送开始通信命令使用,使双方的 USART 端口
    均处于起始状态。
    “COMXXXXYRI”[重新初始化 USART 端口状态完成],此命令用于通知对方,我方己可
    以从头再重新开始收发作业。
      ⑩.“COMXXXXCIT”[从 USART 端口传送控制操作指令],此命令用于通知对方下
    面接着发送的数据为控制操作指令字符串,其字符串的第一个字节也为数据长度字符,
    但字符串的数值有无 CRC 校验码都可以,有 CRC 校验码时长度值相应也加 2 个。发送
    和回应控制操作指令字符串的通信协议遵循发送数据方式。接收方在收到控制操作指令
    字符串后,可能会发回三种回应协议命令:
    ⑴.无法正确识别控制操作指令字符串的内容,表示接收到的指令错误或受到干扰,将
       发回要求对方重新发送命令字符串“COMXXXXRPT”。
    ⑵.己经完成了控制操作指令字符串的内容指定的操作程序,将发回接收数据正确命令
       字符串“COMXXXXOKD”。
    ⑶.控制操作指令字符串的内容为要求向其回传指定的数据,将发回请求发送数据命令
       字符串“COMXXXXATX”。
    
    注释: 
      ①.定时器/计数器0用于约束接收作业全部完成(指从接收第一个数据到最后一
    个数据之间)的时间范围,如果在规定的时间内没有接收作业全部完成,则强制结束
    此次接收作业,以便下次接收作业正确操作。其定时时间应略大于在约定双方通信的
    波特率下接收完 256 个字节所用的时间总和。
      ②.当收发命令字符串“COMXXXXRPT”超过 16 次时,即双方接收和发送无论是数
    据还是协议命令只要其错误总次数超过 16 次,那么就认为双方通信处于不同步状态,
    或通信协议命令混乱。系统将会首先重新初始化本身的 USART 端口状态和数据处理状
    态,然后向对方发送要求对方重新初始化 USART 端口状态命令字符串“COMXXXXRII”,
    以使双方通信重新处于同步状态。
函数入口参数:
函数出口参数:

编译工具软件:      IAR Embedded Workbench for Atmel AVR 版本:3.20 以上
链接子程序文件:

编作者:            
编作者 E-Mail:     PTZSW@163.COM
编制日期:          2005年7月18日
----------------------------------------------------------------------------------------
适用器件芯片类型:
器件芯片时钟频率:   11.0592 MHz
存储器模式:
外部扩展存储器大小:
数据堆栈大小:
----------------------------------------------------------------------------------------
源程序版本历史:
2005年7月18日 -------- 版本 1.0 :发行版本
********************************************************************************************
*/


/*==========================================================================================
                     本源程序包括的头部文件
==========================================================================================*/
#include "Communication_USART.h"              // 本程序的头部文件
#include "DataCheck_CRC_2Bit.h"               // 2位监督码数据循环冗余校验的头部文件
#include "Character_String.h"                 // 字符串函数的头部文件
#include "Control_Handle_Manage.h"            // 对控制操作指令进行识别和处理的头部文件
#include "Access_Extended_SRAM.h"             // 访问空间大于 64 KB 外部随机存储器的头部文件


/*
********************************************************************************************
                                     程序指令代码清单
********************************************************************************************
*/
/*==========================================================================================
函数功能:    本函数用于通用同步和异步串行接收器和转发器(USART),使用中断方式异步接收和发送
              数据通信 USART 端口状态设置的初始化操作。
备注:        本函数仅在主函数中调用一次即可。
==========================================================================================*/
void COMM_USART_initialization(void)
{
#ifdef DUAL_USART_USE_USART0                  // 使用USART0的条件编译
  UCSR0A = 0x00;                              // 清除各状态标志位
  UCSR0B = ((1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0));// 接收器与发送器使能和接收结束中断使能
  UCSR0C = ((1<<UPM01)|(1<<UPM00)|(1<<UCSZ01)|(1<<UCSZ00));// 8 数据位, 1 停止位,奇校验。异步
  UBRR0H = USART0_Baud_H;                     // 设置通信波特率
  UBRR0L = USART0_Baud_L;
#endif                                        // "DUAL_USART_USE_USART0" 条件编译结束

#ifdef DUAL_USART_USE_USART1                  // 使用USART1的条件编译
  UCSR1A = 0x00;                              // 清除各状态标志位
  UCSR0B = ((1<<RXEN1)|(1<<TXEN1)|(1<<RXCIE1));// 接收器与发送器使能和接收结束中断使能
  UCSR0C = ((1<<UPM11)|(1<<UPM10)|(1<<UCSZ11)|(1<<UCSZ10));// 8 数据位, 1 停止位,奇校验。异步
  UBRR1H = USART1_Baud_H;                     // 设置通信波特率
  UBRR1L = USART1_Baud_L;
#endif                                        // "DUAL_USART_USE_USART1" 条件编译结束

#ifdef USE_USART_PORT                         // 使用USART的条件编译
  UCSRA = 0x00;                               // 清除各状态标志位
  UCSR0B = ((1<<RXEN)|(1<<TXEN)|(1<<RXCIE));  // 接收器与发送器使能和接收结束中断使能
  UCSR0C = ((1<<URSEL)|(1<<UPM1)|(1<<UPM0)|(1<<UCSZ1)|(1<<UCSZ0));// 8 数据, 1 停止,奇。异步
  UBRRH = USART_Baud_H;                       // 设置通信波特率
  UBRRL = USART_Baud_L;
#endif                                        // "USE_USART_PORT" 条件编译结束

#ifdef DUAL_USART_USE_USART0                  // 使用USART0的条件编译
//  tcomm_sign0 = tasks_comm_defaults;          // 初始化通讯处理消息任务结构标志变量
#endif                                        // "DUAL_USART_USE_USART0" 条件编译结束

#ifdef DUAL_USART_USE_USART1                  // 使用USART1的条件编译
//  tcomm_sign1 = tasks_comm_defaults;          // 初始化通讯处理消息任务结构标志变量
#endif                                        // "DUAL_USART_USE_USART1" 条件编译结束

#ifdef USE_USART_PORT                         // 使用USART的条件编译
//  tcomm_sign = tasks_comm_defaults;           // 初始化通讯处理消息任务结构标志变量
#endif                                        // "USE_USART_PORT" 条件编译结束

  usart0_rx_index = 0x00;                     // 数据接收缓冲区地址指针归零
  usart0_tx_index = 0x00;                     // 数据发送缓冲区地址指针归零
}

/*==========================================================================================
函数功能:    本函数用于USART0异步通信使用接收结束中断方式以块形式接收数据的
              中断服务程序。
备注:        ①.注意:本函数需在USART0的接收结束中断请求的中断向量函数中调用。
                  在调用之前需使能收结束中断。
              ②.入口参数:本函数在调用时无法进行明式入口参数数值传递,将在函数体中隐式
                            调用下面这几个入口参数的全局静态变量。
                  ⑴.接收通讯命令(tcomm_sign0.tcomm_rdcom),用以判断执行从将接收到的
                      数据写入到命令缓冲区中的处理操作。
                  ⑵.接收通讯数据(tcomm_sign0.tcomm_rddata),用以判断执行从将接收到的
                      数据写入到数据缓冲区中的处理操作。
                  ⑶.通讯接收作业结束(tcomm_sign0.tcomm_rxend),用以通知其它处理函数,
                      本中断函数正在运行中。
              ③.出口参数:本函数在返回时无法进行明式出口参数数值传递,将在函数体中隐式
                            修改下面这几个出口参数的全局静态变量。
                  ⑴.通讯接收作业结束(tcomm_sign0.tcomm_rxend),用以通知其它处理函数,
                      本中断函数己完成通讯接收作业。
                  ⑵.置通讯接收端口标志(tcomm_sign0.tcomm_rxport)为 USART 端口,用以
                      通知其它处理函数通讯接收数据的来源。
==========================================================================================*/
void USART0_RXC_ISR_BlockData(void)
{
  char usart0_rx_status;                      // 临时USART0接收状态变量
  unsigned char usart0_rx_data;               // 临时USART0接收数据变量
#if USART0_RXBUF_SIZE < 256
  unsigned char temp;                         // 临时变量
#else
  unsigned int temp;                          // 临时变量
#endif
  usart0_rx_status = UCSR0A;
  usart0_rx_data = UDR0;
  if (tcomm_sign0.tcomm_rxend == TCOMM_VVALUE)// 检查是否为接收通讯任务的第一个数据?
  {

⌨️ 快捷键说明

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