📄 usart0.c.bak
字号:
#include "lpc2136config.h"
#include "type.h"
#define SEND_OK_BOOT_CODE 0xF0 // 读写器执行成功包帧头
#define SEND_FAIL_BOOT_CODE 0xF4 // 读写器执行失败包帧头
#define INVALID_COMMAND 0x1e // 无效命令
enum command_type
{
//读写器控制类指令
CMD_SET_BAUT_RATE=0x01, // 设置读写器串口波特率
CMD_GET_VERSION, // 获得读写器版本号
CMD_SET_RELAY, // 控制继电器
CMD_SET_OUTPUT_POWER, // 设置读写器射频输出功率
CMD_SET_FREQUENCY, // 设置读写器射频频率
CMD_READ_PARAMETER, // 获得读写器工作参数
CMD_SET_MOD_DEEPTH, // 设置读写器调制深度
CMD_GET_MOD_DEEPTH, // 获得读写器调制深度
CMD_SET_OPERATION_PARAMETER, // 设置读写器工作参数
CMD_SET_ANTENNA, // 选择天线
CMD_GET_JAMMING, // 获得外部射频干扰值
CMD_SET_DEFAULT_PARAMETER, // 设置读写器出厂参数
CMD_COPY_DEFAULT_PARAMETER, // 恢复读写器出厂参数
CMD_REBOOT, // 复位读写器
CMD_SET_ANTENNA_NUM=0x85, // 设置读写器天线数
CMD_SET_FREQUENCY_CH, // 设置读写器频道数
//授权指令
CMD_WRITE_MAC=0x40, // 写厂商授权码
CMD_READ_MAC, // 获得厂商授权码
CMD_WRITE_UAC, // 写用户授权码
CMD_READ_UAC, // 获得用户授权码
CMD_AUTHORIZE_TAG, // 授权标签
CMD_CHECK_AUTHORIZE_TAG, // 验证标签授权状态
CMD_SET_AUTHORIZATION, // 设置读写器授权功能
CMD_GET_AUTHORIZATION, // 获得读写器授权功能
//读写EM公司标签指令
EM_GETLOCK=0xC9, // 获得标签写保护状态
EM_SETLOCK, // 设置标签写保护
EM_WRITEPAGEBLOCK, // 写标签数据
EM_READPAGEBLOCK, // 读标签数据
EM_LISTIDREPORT, // 获得已读标签ID
EM_LISTID, // 识别标签ID
//读写EPC C1G2标签指令
EPC1G2_EASALARM=0xE4, // 获得标签报警状态
EPC1G2_CHANGEEAS, // 设置标签报警状态
EPC1G2_BLOCKLOCK, // 设置标签数据块写保护
EPC1G2_WRITEEPC, // 写标签EPC码
EPC1G2_KILLTAG, // 毁灭标签
EPC1G2_NA,
EPC1G2_SETLOCK, // 设置标签写保护
EPC1G2_WRITEDATA, // 写标签数据
EPC1G2_READDATA, // 读标签数据
EPC1G2_REPORTID, // 获得已读标签ID
EPC1G2_LISTID, // 识别标签ID
//读写ISO18000-6B标签指令
ISO6B_GETLOCK=0xF3, // 获得标签写保护状态
ISO6B_SETLOCK, // 设置标签写保护
ISO6B_WRITEDATA, // 写标签数据
ISO6B_READDATA, // 读标签数据
ISO6B_READSELECTID=0xFB, // 有条件识别标签ID
ISO6B_REPORTID=0xFD, // 获得已读标签ID
ISO6B_LISTID=0XFE // 无条件识别标签ID
};
volatile uint8 command_buffer[48];
uint8 data_result[252]; // 长度为FF最多冲坏待发送区域
volatile uint8 usart0_receive_num; // 串口0当前接收数据数目 新加
volatile uint8 usart0_receive_len; // 串口0接收数据长度 新加
volatile uint8 usart0_send_len; // 串口0发送数据长度
volatile uint8 usart0_signal_flags; // 串口0的通讯标识
volatile uint32 usart0_timer_base; // 串口0接收间隔计时 新加
volatile uint32 usart0_timer_update; // 串口0
#define usart0_timer_over_value 200 // 串口0超时参数10us*200=2ms
#define usart0_receiving_set usart0_signal_flags|=0x01 // 串口0正在接收数据
#define usart0_receive_ok_set usart0_signal_flags|=0x02 // 串口0接收完数据
#define usart0_received_len_set usart0_signal_flags|=0x04 // 串口0已收到数据包长度字节 没用
#define usart0_r_timer_over_set usart0_signal_flags|=0x08 // 串口0接收超时 没用
#define usart0_sending_set usart0_signal_flags|=0x10 // 串口0正在发送数据
#define usart0_receive_boot_set usart0_signal_flags|=0x20 // 串口0收到帧头 新加
#define usart0_receive_boot usart0_signal_flags&0x20 // 检查帧头
#define usart0_receive_ok usart0_signal_flags&0x02 // 检查收完数据
#define usart0_receiving usart0_signal_flags&0x01 // 检查正在接收数据
#define RECEIVE_BOOT_CODE 0x40 // 上位机指令包帧头
#define SEND_OK_BOOT_CODE 0xF0 // 读写器执行成功包帧头
#define SEND_FAIL_BOOT_CODE 0xF4 // 读写器执行失败包帧头
void __irq IRQ_UART0(void)
{
uint32 receivebuf,uartiir;
usart0_timer_update=0x01; // 置位更新时间标志
uartiir=U0IIR&0x0f; // 取得中断标志
if (uartiir==0x04) // 接收到数据标志
{
receivebuf=U0RBR; // 串口数据读到临时变量备用
if (usart0_receive_boot) // 已经收到帧头
{
command_buffer[usart0_receive_num]=receivebuf;
if (usart0_receive_num==0) // 接收的是长度
usart0_receive_len=receivebuf;
else // 接收的是数据及校验
{
if (usart0_receive_num==usart0_receive_len)
{
usart0_receive_ok_set; // 接收数据完成
U0IER=0x00; // 关闭接收中断,等发送完或出错再开
}
}
++usart0_receive_num;
}
else // 帧头还没收到
{
if (receivebuf==RECEIVE_BOOT_CODE) // 是帧头
{
usart0_receive_boot_set; // 置位帧头标志
usart0_receive_num=0; // 初始化接收指针
usart0_receiving_set; // 置位正在接收数据
}
}
}
VICVectAddr = 0x00; // 中断处理结束
}
__inline void usart0_send_process(uint8 *BufferPtr,uint32 Length)
{
while (Length!=0)
{
while ((U0LSR&0x20)==0x20)
{
U0THR=*BufferPtr;
BufferPtr++;
Length--;
}
}
U0IER=0x01; // 允许新的接收中断
}
__inline uint32 analyse_receive_data(void) // 原文档带参数,考虑到接收缓冲区是全局的,就直接用,不传指针进函数,且带参数返回
{
uint32 loop,checksum,length;
length=*command_buffer;
checksum=0x40;
for (loop=length;loop!=0xffffffff;loop--) // 因为有效数据从地址0开始,故结束于0xffffffff
checksum+=*(command_buffer+loop);
if ((checksum&0x000000ff)==0x00000000) // 校验通过
{
loop=*(command_buffer+1); // 借用loop做临时变量
if (loop>0x000000bf) // 读写类指令
checksum=loop&0x000000f0; // 分类返回0xc0 0xe0 0xf0
if (loop<0x00000020) // 控制类指令
checksum=0x000000000; // 分类返回0x00
}
else
checksum=0x000000001;
return(checksum); // 校验错就返回0x01,否则分类返回0x00 0xc0 0xe0 0xf0
}
__inline void Cmd_Get_Version(void)
{
uint32 loop,checksum;
data_result[0]=SEND_OK_BOOT_CODE;
data_result[1]=0x06;
data_result[2]=0x02;
data_result[3]=0X0f;
data_result[4]=0x02; // 硬件版本号天线数目
data_result[5]=0x00; // 软件版本号高字节
data_result[6]=0x00; // 软件版本号低字节
checksum=SEND_OK_BOOT_CODE+0x06+0x02+0x0f;
for (loop=4;loop<7;loop++)
checksum+=data_result[loop];
data_result[7]=(0-checksum)& 0xff;
usart0_send_process(data_result,0x08);
}
__inline void Cmd_Invalid(void)
{
uint32 temp,checksum;
temp=*(command_buffer+1);
data_result[0]=SEND_FAIL_BOOT_CODE;
data_result[1]=0x03;
data_result[2]=INVALID_COMMAND;
data_result[3]=temp;
checksum=SEND_FAIL_BOOT_CODE+0x03+INVALID_COMMAND+temp;
data_result[4]=(0-checksum)& 0xff;
usart0_send_process(data_result,0x05);
}
__inline void control_ReadWrite(void)
{
uint32 usart0_current_command;
usart0_current_command=*(command_buffer+1);
switch(usart0_current_command) // 处理工作参数
{
case CMD_SET_BAUT_RATE: // 设置读写器串口波特率
Cmd_Invalid();
break;
case CMD_GET_VERSION: // 获得读写器版本号
Cmd_Get_Version();
break;
case CMD_SET_OUTPUT_POWER: // 设置读写器射频输出功率
Cmd_Invalid();
break;
case CMD_SET_FREQUENCY: // 设置读写器射频频率
Cmd_Invalid();
break;
case CMD_READ_PARAMETER: // 获得读写器工作参数
Cmd_Invalid();
break;
case CMD_SET_MOD_DEEPTH: // 设置读写器调制深度
Cmd_Invalid();
break;
case CMD_GET_MOD_DEEPTH: // 获得读写器调制深度
Cmd_Invalid();
break;
case CMD_SET_OPERATION_PARAMETER: // 设置读写器工作参数
Cmd_Invalid();
break;
case CMD_GET_JAMMING: // 获得外部射频干扰值
Cmd_Invalid();
break;
case CMD_SET_DEFAULT_PARAMETER: // 设置读写器出厂参数
Cmd_Invalid();
break;
case CMD_COPY_DEFAULT_PARAMETER: // 恢复读写器出厂参数
Cmd_Invalid();
break;
case CMD_SET_ANTENNA_NUM: // 设置读写器天线数
Cmd_Invalid();
break;
case CMD_SET_FREQUENCY_CH: // 设置读写器频道数
Cmd_Invalid();
break;
case CMD_REBOOT: // 复位读写器
Cmd_Invalid();
break;
default:
Cmd_Invalid();
break;
}
}
void em_ReadWrite(void)
{
Cmd_Invalid();
}
void epcc1g2_ReadWrite(void)
{
Cmd_Invalid();
}
void iso6b_ReadWrite(void)
{
Cmd_Invalid();
}
void usart0_receive_process(void) // usart0.c
{
uint32 checksum;
if (usart0_receive_ok)
{
//原文档带参数,考虑到接收缓冲区是全局的,就直接用,不传指针进函数,且带参数返回区分各类命令
//省掉全局变量sumcheck_ok
usart0_signal_flags=0; // 复位串口0标志
checksum=analyse_receive_data();
switch (checksum)
{
case 0x00:
control_ReadWrite();
IOPIN=IOPIN^0x00800000; //调试观察
break;
case 0xc0:
em_ReadWrite();
break;
case 0xe0:
epcc1g2_ReadWrite();
break;
case 0xf0:
iso6b_ReadWrite();
break;
default: // 校验错
U0IER=0x01; // 允许新的接收中断
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -