打印

求教,关于单片机和TC35I联机问题??

[复制链接]
1939|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
新好男孩|  楼主 | 2007-8-17 15:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机向TC35I发送AT指令,TC35I返回是正确的(通过串口查看的),但是我的程序就是捕捉不到TC35I的返回值,但我用串口调式器向单片机发送数据,单片机也能收到正确的数据,这是为什么???

/************************************************************************************************************
Function    : TC35I_OnLine()
Description    : // TC35I联机
Parameters    : 
            
Returns        : 无
*************************************************************************************************************/
void TC35I_OnLine(void)
{
    IGT = 0;
    DelayMs(500);
    IGT = 1;                //开机
    DelayMs(15000);            //延时

// 以下代码是在测试TC35I的波特率

    // 以38400的波特率匹配
    Send_AT_Command("AT+IPR=38400\r\n", 0);

    // 以1200的波特率匹配
    uart_init(UART_RATE12);
    DelayMs(200);
    Send_AT_Command("AT+IPR=38400\r\n", 0);

    // 以2400的波特率匹配    
    uart_init(UART_RATE24);
    DelayMs(200);
    Send_AT_Command("AT+IPR=38400\r\n", 0);

    // 以4800的波特率匹配
    uart_init(UART_RATE48);
    DelayMs(200);
    Send_AT_Command("AT+IPR=38400\r\n", 0);

    // 以9600的波特率匹配
    uart_init(UART_RATE96);
    DelayMs(200);
    Send_AT_Command("AT+IPR=38400\r\n", 0);
    
    // 以19200的波特率匹配
    uart_init(UART_RATE192);
    DelayMs(200);
    Send_AT_Command("AT+IPR=38400\r\n", 0);
    
    // 以57600的波特率匹配
    uart_init(UART_RATE576);
    DelayMs(200);
    Send_AT_Command("AT+IPR=38400\r\n", 0);
    
    // 以115200的波特率匹配
    uart_init(UART_RATE1152);
    DelayMs(200);
    Send_AT_Command("AT+IPR=38400\r\n", 0);
    
    // 再返回38400的波特率匹配
    uart_init(UART_RATE384);
    DelayMs(200);
    Send_AT_Command("AT+IPR=38400\r\n", 0);
    DelayMs(5000);
    ////////////这里是在接收TC35I的返回值///////////////////////////////
    Host_Rec_init();
    Send_AT_Command("AT\r\n", 0);
    DelayMs(500);
    Send_AT_Command(RXD_Buffer, RXD_Buffer_Counter);
}

////////////////////////////////////////////////////////////////////




/*--------------------------------------------------------------------*-

    SysTick.C (V1.00)

    这里是系统的时标.
    
     
-*---------------------------------------------------------------------*/

/*
 * Copyright (c) 2007
 * All rights reserved
 * 
 * 文件名称: SysTick.C  
 * 文件标识: 
 * 摘     要: 系统的时标
 * 
 * 当前版本: 1.0         * 取代版本:
 * 作     者: wsl         * 原作者  : 
 * 完成日期: 2007-07-31     * 完成日期:
 ************************************************************************/


#include "main.h"
#include "SysTick.h"




// 串行口发送
unsigned char xdata Txd_Buffer[MAX_TRANSMIT_LENGTH];
unsigned char data Txd_Counter;                        // 串行口要发送的字节数
bit Sendit;                                            // 串口发送状态. 0 发送中, 1 发送完毕
// 私有函数
static void serial_transmit(unsigned char *pBuffer,unsigned char number,unsigned char MaxLen);
// 串行口发送
unsigned char idata RXD_Buffer[MAX_RECEIVE_LENGTH];
unsigned char data RXD_Buffer_Counter;
bit bFrameReady;
bit IS_REC_OVERTIME;

// 拔号音标志
bit bToneFlag;
//T0高低加载寄存器
unsigned char TC1_PRELOAD_H, TC1_PRELOAD_L;    






 /*---------------------------------------------------------*-
 * 函数名称: T0_TICK_INIT()
 * 入     口: 
 * 出     口:
 * 函数功能: T0初始化
 * 
 * 说     明: 为了时标的准确性,系统采用T0模式1,16位加载模式.
 *             将T0的低位计数器设计为自动加载.
 *              
 * 当前版本: 1.0         * 取代版本:
 * 作     者: wsl         * 原作者  : 
 * 完成日期: 2007-07-31     * 完成日期:
-*---------------------------------------------------------*/
void T0_TICK_INIT(void)
{
    TMOD &= 0xf0;
    TMOD |= 0x01;
    TL0 = 0;
    TH0 = PRELOAD_mS_H;
    ET0 = 1;
    TR0 = 1;
}


 /*---------------------------------------------------------*-
 * 函数名称: SystemTick()
 * 入     口: 
 * 出     口:
 * 函数功能: 系统时标.任何任务执行时间都不能大于系统时标.
 * 
 * 说     明: T0的低位计数器为自动加载.
 *             
 *              
 * 当前版本: 1.0                 * 取代版本:
 * 作     者: wsl                 * 原作者  : 
 * 完成日期: 2007-07-31             * 完成日期:
-*---------------------------------------------------------*/
void SystemTick(void) interrupt 1 using 1
{
    TH0 = PRELOAD_mS_H;

}
//////////////////////////////////////////////////////////////////////////////////////////////////////    



//////////////////////////////////////////////////////////////////////////////////////////////////////
void TC1_init(void)
{
    TMOD &= 0x0f;
    TMOD |= 0x10; 
    TH1=TC1_PRELOAD_H=0xf8;
    TL1=TC1_PRELOAD_L=0x00;
    TR1=1;
    ET1 = 1;
}

///////////////////////////////////////////////////////////////////////////////
//每1.11ms中断一次
void TONE_ISR() reentrant interrupt 3 using 2
{
    //1.1ms中断
    if(bToneFlag)
    {
        ToneIn=~ToneIn;
        TH1=TC1_PRELOAD_H;
        TL1=TC1_PRELOAD_L;
    }
        
    if (IS_REC_OVERTIME)
    {
        TR1 = 0;
        bFrameReady = 1; //置位接收OK
        IS_REC_OVERTIME = 0;
    }
}


/*****************************************************************
Function    : uart_init()
Description    : 
Parameters    : 
                
Returns        : 无
*****************************************************************/
void uart_init(const unsigned int Xpbs)
{
    T2CON &= 0x00;
    TCLK = 1;
    RCLK = 1; // 定时器2用于波特率发生器
    TL2 = Xpbs & 0x00ff;
    RCAP2L = Xpbs & 0x00ff;
    TH2 = Xpbs >> 8;
    RCAP2H = Xpbs >> 8;// 定时器2自动装载寄存器低位和高位
    PCON &= 0x7f;
    SCON = 0x50;
    TR2 = 1;
    ES = 1;
    Sendit = 1;    // 不置位就会产生一个循环错误
//    EA = 1;
//    TI = 1;
//    RI = 1;
}

/*****************************************************************
Function    : 
Description    : 串行口中断服务程序
Parameters    : 无
            
Returns        : 无
*****************************************************************/
void Uart_Interrupt(void)interrupt 4 
{    
    unsigned char SBUF_TEMP;

    if (RI)
    {
        RI = 0;
        // 如果是接收中断
        SBUF_TEMP = SBUF; // 每次只接收一个字节?

        if (bFrameReady)    // 上次接收完后数据没有读取
        {
            return;    //返回.
        }

        if (SBUF_TEMP == 0x0d)
        {
            return;    //如果是回车符,不作处理.
        }

        if (SBUF_TEMP == 0x0A)
        {    // 如果是换行符,接收完后,开始设定时值如1.1 MS,并开启定时器,
            // 如果后面没有数据了,超过1.1MS,即表示数据接收完毕了,下面可以对收到的数据处理了。
            TR1 = 0;
            TH1 = 0xf8;
               TL1 = 0x00;
               TR1 = 1;
            // 以下两者只能取其一
            IS_REC_OVERTIME = 1;
            bToneFlag = 0;
            return;
        }

        TR1 = 0;    // 程序能运行到这里说明串口接收没有超时
         //因为缓冲区大小的限制,超出部分不接受 
        if (RXD_Buffer_Counter >= (MAX_RECEIVE_LENGTH-1))
        {
            RXD_Buffer_Counter = (MAX_RECEIVE_LENGTH-1);
        }

        RXD_Buffer[RXD_Buffer_Counter++] = SBUF_TEMP;
    }

    /*数据发送处理*/
    if ( TI )
    {
        TI = 0;
        Sendit = 1;
    }
}

/*****************************************************************
Function    : Host_Rec_init()
Description    : 主机接收初始化
Parameters    : 无
            
Returns        : 无
*****************************************************************/
void Host_Rec_init(void)
{
    //接收信息
    RXD_Buffer_Counter = 0;                        // 接收字节个数清'0'
//    memset(RXD_Buffer,0,MAX_RECEIVE_LENGTH);    // 串口接收缓冲区清'0'
    bFrameReady = 0;                            // 可以接收数据
}

相关帖子

沙发
winloop| | 2007-8-17 17:06 | 只看该作者

串口上要串个电阻好像

使用特权

评论回复
板凳
新好男孩|  楼主 | 2007-8-17 17:16 | 只看该作者

谢谢提醒,我知道问题了.

谢谢提醒,我知道问题了.
问题是我向TC35发指令,同时又用串口调试器查看单片机的运行状态,这样就干扰了单片机接收TC35的返回值.现在去掉串口调试器的连接,单片机和TC35通信就正常了,现在考虑是不是在串口上串两个电阻试试!看能不能去掉干扰.

使用特权

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

本版积分规则

25

主题

136

帖子

0

粉丝