打印

为毛串口就是收不到数据呢?为毛?请各位乱入!

[复制链接]
5892|31
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bigfish1978|  楼主 | 2012-1-14 22:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
自己做了个TC35的小板子,初始化时遇见问题了,发送的命令倒是出去了,就是接收不到串口的数据,请各位帮忙分析下代码。
#include<reg52.h>
#include<string.h>
unsigned char r[]="",n=0;
void delay(unsigned int z)//延时
{
unsigned int x,y;
for(x=0;x<z;x++)
  for(y=0;y<110;y++);
}
void s_init()//初始化串口
{
SCON=0X50;
TMOD=0X20;
PCON=0X80;
TH1=0XFA;
TL1=0XFA;
// ES=0;
EA=1;
TR1=1;
}
void main()
{
unsigned char p1[]="at+clip=0\x0d\x0a", //向tc35发送复位命令
p2[]="at+csq\x0d\x0a",//网络质量返回
p3[]="at^snfs=2\x0d\x0a",
i;

s_init();
while(!(r[n-2]=='K')) //判断串口返回的字符串倒数第三位是不是'K'
{
  n=0;
  memset(r,0,sizeof(r));//字符数组清零
  for(i=0;i<11;i++)//循环发送AT+CFUN=1,1
  {
   ES=0;
   SBUF=p1[i];
   while(!TI);//判断发送否
   TI=0;//置位TI
  }
  ES=1;//开串口中断开始接收
  delay(100);
}
n=0;
memset(r,0,sizeof(r));
while(!(r[n-2]=='K'))
{
  n=0;
  memset(r,0,sizeof(r));
  for(i=0;i<8;i++)
  {
   ES=0;
   SBUF=p2[i];
   
   while(!TI);
   TI=0;
  }
  ES=1;
  delay(100);
}
n=0;
memset(r,0,sizeof(r));
while(!(r[n-2]=='K'))
{
  n=0;
  memset(r,0,sizeof(r));
  for(i=0;i<11;i++)
  {
   ES=0;
   SBUF=p3[i];
   
   while(!TI);
   TI=0;
  }
  ES=1;
  delay(100);
}
memset(r,0,sizeof(r));
n=0;
}
void chuankou() interrupt 4
{
  unsigned char tmp;
  tmp=SBUF;
  r[n]=tmp;
  RI=0;
  n++;

}

相关帖子

沙发
李富贵| | 2012-1-14 22:18 | 只看该作者
用存储示波器或者逻辑分析仪抓一下波形。

使用特权

评论回复
板凳
bigfish1978|  楼主 | 2012-1-14 22:23 | 只看该作者
程序是不是有什么问题?

使用特权

评论回复
地板
NE5532| | 2012-1-14 22:39 | 只看该作者
发出去的数据对不对?波特率对不对?怎么判断进不了接收中断的?

使用特权

评论回复
5
bigfish1978|  楼主 | 2012-1-14 22:42 | 只看该作者
发出去的数据是对的,波特率是9600,晶振11.0592,正常情况下模块受到AT命令后应该回送一个0x0d0x0aOK0x0d0x0a的。我就是判断这个K,如果收不到就重新发,串口现实的结果是,命令狂发。

使用特权

评论回复
6
NE5532| | 2012-1-14 22:48 | 只看该作者
1.发出去不见得对,自己用示波器校正连续发送0x55的BIT时间(为啥这样做,自己想)
2.收不到应答,不代表模块是正常的,在不能知道谁对谁错的情况下,应该分系统调试,上串口助手~!
3.楼主的疑惑源于不会程序调试的基本方法,推荐——《程序调试黑宝书》

使用特权

评论回复
7
bigfish1978|  楼主 | 2012-1-14 22:57 | 只看该作者
感谢6楼,模块是好的,接到模块的串口上发送AT命令一切都正常,接打电话也没问题,如果我不判断返回OK的话,单靠发送AT命令、延时、发送、延时这个步骤的话,也能正常使用模块,不过我想让模块给电话提供一个振铃的提示,就必须要接收模块返回来的数据了。

使用特权

评论回复
8
cjseng| | 2012-1-14 23:11 | 只看该作者
你每次发送命令给TC35,它是不会马上应答的,而你只是delay(100),马上又发送下一帧命令了,而且在发命令的时候,ES=0;这样TC35永远没机会给你应答的。

说实话,你在调试的时候根本不用接上TC35,直接用串口调试工具好了,发送出一帧命令后,在串口调试工具里手工发送应答信号0x0d0x0aOK0x0d0x0a,看看程序什么反应。
或者直接用串口调试工具给TC35手工发命令,看看它怎么回应。

使用特权

评论回复
9
ningling_21| | 2012-1-14 23:36 | 只看该作者
LZ的波特率加倍了?
是不是9600?

使用特权

评论回复
10
bigfish1978|  楼主 | 2012-1-14 23:39 | 只看该作者
8楼,我用串口给TC35发,木问题,单片机发的命令看着也正常。
9楼波特率加倍了,如果波特率不对应该发出的数据也乱了啊,我用串口助手9600下看的是正常的。

使用特权

评论回复
11
cjseng| | 2012-1-14 23:57 | 只看该作者
你尝试用串口调试工具不断地向单片机发送模拟的应答信号试试看。或者将delay(100)改成delay(1000)甚至更长时间试试。

使用特权

评论回复
12
bigfish1978|  楼主 | 2012-1-15 00:44 | 只看该作者
两种都没反应。。。

使用特权

评论回复
13
cjseng| | 2012-1-15 00:50 | 只看该作者
呃,你把程序改成能收到数据就给个信号看看是怎么回事,首先看一下能不能进入接收中断。

使用特权

评论回复
14
bigfish1978|  楼主 | 2012-1-15 01:18 | 只看该作者
进接收中断了,我在接收中断里加了个亮灯,结果灯亮了,不过没写灭灯指令,灯居然亮了6秒自己灭了。。

使用特权

评论回复
15
NE5532| | 2012-1-15 09:23 | 只看该作者
进接收中断了,我在接收中断里加了个亮灯,结果灯亮了,不过没写灭灯指令,灯居然亮了6秒自己灭了。。
bigfish1978 发表于 2012-1-15 01:18


画流程图把,新手不要偷懒,让你用串口助手给单片机发数据看看呢。

使用特权

评论回复
16
cjseng| | 2012-1-15 10:50 | 只看该作者
灯灭了是因为数组下标溢出,程序不知道干什么去了。

建议将接收缓冲区先改成两个字节,每接收到一个字节就把第一个字节清空,将第二个字节移到第一个字节,然后将接收到的数据放入第二个字节,这样,没接收一次,判断一下连续的两个字节是不是“OK”

temp=SBUF;
r[0]=r[1];
r[1]=temp;
if((r[0]=='O')&&(r[1]=='K'))
{
该干嘛干嘛!
}

使用特权

评论回复
17
dengm| | 2012-1-15 13:19 | 只看该作者
"OK" 是给人看的, 用res code: "0"

使用特权

评论回复
18
bingbo1970| | 2012-1-15 14:24 | 只看该作者
学习中

使用特权

评论回复
19
cjseng| | 2012-1-15 16:14 | 只看该作者
你这样好了,程序只做一个循环,在这个循环中,单片机收到数据不要做判断了,最后将收到的数据统一发出来,看看到底收到的是什么,这样不就好了?将接收缓冲区开大一点。

有一点体会就是:连续对TC35发数据,容易把TC35搞死。

使用特权

评论回复
20
cjseng| | 2012-1-15 16:39 | 只看该作者
仔细看了下程序,觉得编程思路有问题!


void main()
{
s_init();
while(!(r[n-2]=='K'))                   //判断串口返回的字符串倒数第三位是不是'K'
{
  n=0;
  memset(r,0,sizeof(r));                 //字符数组清零
  for(i=0;i<11;i++)                      //循环发送AT+CFUN=1,1
  {
   ES=0;                                 //这并不能阻止TC35对单片机发数据,也不能阻止单片机接收数据,只是接收到数据不会引起中断,
                                             //此时如果单片机收到数据,照样会RI=1;
   SBUF=p1;
   while(!TI);                           //判断发送否
   TI=0;                                 //置位TI
  }
  
  ES=1;                                  //开串口中断开始接收????很有可能在此之前,RI已经是1,一开中断允许将马上引起接收中断
  delay(100);                           //延时这段时间的依据是什么?TC35收到命令后多长时间会应答?
}
n=0;                                     //如同上面所说,此时清零可能为时已晚,n很可能已经造成数组下标溢出   
                                             //溢出后,程序将会发生什么,天知道!!!!!!
}
void chuankou() interrupt 4
{
unsigned char tmp;
tmp=SBUF;
r[n]=tmp;
RI=0;
n++;                                    //这个n什么时候清零?能不能保证数组不溢出?
}

使用特权

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

本版积分规则

0

主题

23

帖子

0

粉丝