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 为空;
{
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
for (loop=0;loop<length+1;loop++)
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
}
代码不全,只列出来了光件代码!