单片机向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; // 可以接收数据 } |