打印

我的串行口发送程序怎么进不了中断????

[复制链接]
1783|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
新好男孩|  楼主 | 2007-8-1 11:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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];    
    }
}

相关帖子

沙发
新好男孩|  楼主 | 2007-8-1 11:34 | 只看该作者

谢谢!我知道问题了.

是串行口初始化问题:
 void uart_init(unsigned char Xpbs)
 {
     TMOD &= 0x0f;
    TMOD |= 0x20;
    //PCON |= 0x80;    
    TL1 = TH1 = Xpbs;
    SCON = 0x50;
    TR1 = 1;
    ES = 1;
//    EA = 1;
//    TI = 1;
//    RI = 1;
 }

使用特权

评论回复
板凳
gjg191| | 2007-8-1 12:20 | 只看该作者

搞笑!!

搞笑!!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

136

帖子

0

粉丝