main(void) { /*Msg必须是一个16位的无符号整形数*/ unsigned int data Msg; /*用于传递消息类型和消息值*/ msg_init(); T0_TICK_INIT(); Uart_init(); uart_init(UART_RATE96); EA = 1; MSTimerStart(MSTIMERMODE_HANDLE_IN_MSG, 50, fnu2); // MSTimerStart(); while(TRUE) { MSG_GET_MSG(&Msg); switch(MSG_TYPE(Msg)) { case MSG_KEY: break; case MSG_RTC: //uputbyte(i++); //uputbyte('*'); break; case MSG_MSTIMER: MSG_GET_DATA(&Msg); FUNC(Msg); break; case MSG_TEST: //special for test break; case MSG_NULL:
break; default: //no msg, or error msg break; } } }
/********************************************************************/ /*--------------------------------------------------------------------*-
UART.C (V1.00)
通过调用功能函数把数据块插入缓冲区中,功能函数中包含一个指针指向待传送 的数据,还包含一个计数器表明要传送字节的数量数据被拷贝到缓冲区中缓冲区 中的尾指针被相应的更新. -*---------------------------------------------------------------------*/
/* * Copyright (c) 2007 * All rights reserved * * 文件名称: UART.C * 文件标识: * 摘 要: * * 当前版本: 1.0 * 取代版本: * 作 者: wsl * 原作者 : * 完成日期: 2007-07-31 * 完成日期: ************************************************************************/
#include "main.h" #include "message.h" #include "timer.h" #include "SysTick.h" #include "Uart.h"
/*串行口发送函数数据类型定义*/ #define SENDMAXSIZE 20 /*定义发送缓冲区容量*/
struct { unsigned char SendBuffer[SENDMAXSIZE]; unsigned char SendBufferHead; unsigned char SendBufferTail; unsigned char Sendit;// 作标志位使用. }SendStruct;
/*串行口接收函数数据类型定义*/ #define RECMAXSIZE 20
struct { unsigned char RecBuffer[RECMAXSIZE]; unsigned char RecBufferHead; unsigned char RecBufferTail; unsigned char FlagRec; unsigned char RecDataOverflow; unsigned char RecDataLen; }RecStruct;
void uart_init(unsigned char Xpbs) { TMOD &= 0x0f; TMOD |= 0x1;
//PCON |= 0x80; TL1 = TH1 = Xpbs; TR1 = 1; ES = 1; // EA = 1; // TI = 1; // RI = 1; }
void Uart_init(void) { // 清串口接收缓冲区 RecStruct.RecBufferHead = RecStruct.RecBufferTail = 0; RecStruct.FlagRec = 0; // 串行口发送端设置 SendStruct.SendBufferHead = SendStruct.SendBufferTail = 0; SendStruct.Sendit = 1; /*串行口允许发送*/ }
// 发送一个字节 void SendCommChar(const unsigned char ch) { SendStruct.SendBuffer[SendStruct.SendBufferTail] = ch; SendStruct.SendBufferTail++; if (SendStruct.SendBufferTail == SENDMAXSIZE)/*注意(==)*/ { SendStruct.SendBufferTail = 0; } if (1 == SendStruct.Sendit) { SBUF = SendStruct.SendBuffer[SendStruct.SendBufferHead]; } }
// 发送一个字符串 /***************************************************************** Function : SendCommString() Description : 把所指向的存储区中的数据拷贝到缓冲区中 Parameters : base – 指针指向要拷贝数据的头地址 size – 所要拷贝数据的数量 Returns : 无 *****************************************************************/ void SendCommString(unsigned char *base, const unsigned char size) { unsigned char i = 0;
if ( !size || (base == NULL) ) { return; // 试参数是否有效 }
if (SendStruct.SendBufferTail == SendStruct.SendBufferHead) { SendStruct.Sendit = 1; /*置位发送标志*/ }
while ( i < size ) { // 当缓冲区有空间且数据区中还有数据时,进行拷贝 SendStruct.SendBuffer[SendStruct.SendBufferTail] = base; // 拷贝当前字节 i++; SendStruct.SendBufferTail++; // 移动指针 if (SendStruct.SendBufferTail == SENDMAXSIZE)// 指针是否超出范围 { SendStruct.SendBufferTail = 0; } }
if (1 == SendStruct.Sendit) // 是否要传输一个字节 {// 在里以后,程序应该要进入中断的呀,可是程序就是进入不了中断 SBUF = SendStruct.SendBuffer[SendStruct.SendBufferHead]; } }
|