打印

51串口通信奇怪的问题,高手指点一下

[复制链接]
2357|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hall919|  楼主 | 2007-4-6 15:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用Keil 注册过的
 
IDE-Version:
礦ision3 V3.34
Copyright (c) Keil Elektronik GmbH / Keil Software, Inc. 1995 - 2006

License Information:
mao hall
ailansoft
LIC=EXT9L-0FAGJ-ANFAZ-Y4U1E-SBXW4-CKWPP

Tool Version Numbers:
Toolchain Path:    E:\Program Files\Keil\C51\BIN\
C Compiler:         C51.Exe       V8.06
Assembler:          A51.Exe
Linker/Locator:     BL51.Exe       V6.05
Librarian:          LIB51.Exe       V4.24
Hex Converter:      OH51.Exe       V2.6
CPU DLL:            S8051.DLL       V3.10
Dialog DLL:         DP51.DLL       V2.48f
Target DLL:     BIN\VDM51.DLL
Dialog DLL:         TP51.DLL       V2.48f

下面是我的程序::

#include <reg52.h>

#define uchar unsigned char
#define uint  unsigned int

sbit LED0  = P1^0;
sbit LED1 = P1^1;
sbit Sw = P1^2;
uchar buffer[8];
uchar sign = 0;
uchar rev_num = 0;

void delay(uint time)
{
    int i = 1000;
    for(time;time>0;time--)
        for(i;i>0;i--);
}

void UART_init()     /*串口初始化*/
{
    SCON = 0x50;    /*串行口工作方式1,10位异步收发*/    
    TMOD =0x20;    /* TMOD: timer 1, mode 2, 8-bit reload */
    TH1 = 243;    /* TH1:  reload value for 2400 baud @ 6MHz   */
    TL1 = 243;
    PCON = 0x80;  /*波特率加倍*/
    RI = 0;    //清收发标志
    TI = 0;
    TR1 = 1;            /*启动T/C1*/
    
}

void serial() interrupt 4
{
    
    RI=0;
    buffer[rev_num] = SBUF;
    rev_num += 1;
    if(rev_num > 6)
    {
        sign = rev_num;
        rev_num &= 0x00;
    }
}

void main()
{

    uchar i=0;
    P0 = 0;
    P2 = 0;
    P1 = 0;
    LED0 = 1;
    LED1 = 1;
    Sw = 1;
    UART_init();
    EA=1;
    ES=1; //开串口中断
    while(1)
        {    
     if(sign>0 )
     {
        SBUF = 'A';
       while(!TI);
          TI = 0;
       for(i=0;i< sign;i++)
           {
          SBUF = buffer;
        TI = 0;
       while(!TI);
            SBUF = i + 0x30;
       TI = 0;
      while(!TI);
          }

          sign &= 0x00;
          LED1 =  ~LED1;
          sign &= 0x00;
          delay(1000);
        }else{
        delay(20000);
        LED0 = ~LED0;
        LED1 =  1;
        }  
 
  
    }
 
 }

这是整个代码,我想从PC发一个字符串,然后单片机接收到再把整个字符串发给PC机,但是这样实际却不是这样.
  比如我发送abcdefg,单片机发回来是ggggggg,并且一直隔几百ms就发送一次,停不下来.并且并不是执行整个for循环,只发送g,而不发送'A'.
  请问各位,问题出在哪里呢????

相关帖子

沙发
ayb_ice| | 2007-4-6 15:59 | 只看该作者

随便说说

  肯定是程序问题...

使用特权

评论回复
板凳
古木雨林| | 2007-4-6 17:07 | 只看该作者

使用特权

评论回复
地板
hall919|  楼主 | 2007-4-7 14:21 | 只看该作者

怎么没有人回答呢?

 不知道是不是编译的问题
  我看程序也没有什么问题啊,但好像进入for循环中就出不来了,sign也不能赋值了,所以就一直发送最后一个字符.

使用特权

评论回复
5
nust1996| | 2007-4-7 15:18 | 只看该作者

软件模拟一下

就知道哪里问题了啊

使用特权

评论回复
6
hall919|  楼主 | 2007-4-7 17:09 | 只看该作者

软件模拟是对的

 我使用软件模拟,可以看到是对的,和我认为的步骤一样.
  如果我不用串口把接收的数据发送给PC,把下段程序改一下,使用P1口用LED显示.
for(i=0;i< sign;i++)
    {
       TI = 0;
       SBUF = buffer;
       while(!TI);
     }
改为
for(i=0;i< sign;i++)
    {
      P1 = buffer;
      delay(1000);
     }

  通过几个发光二极管灯显示,好像也是对的.
  
 为什么使用串口发送就不行呢????????????
  困惑了很长时间,希望高手给点指导!!!
 图是串口调试的情况,发送123456,正确的话单片机应该发送回来123456,但是却一直在发送6.

使用特权

评论回复
7
zgl7903| | 2007-4-7 19:29 | 只看该作者

发送完数据TI置1时,也会发生中断

所以进中断后应该先判断一下是否是接受中断
void serial() interrupt 4
{
    if(RI)
    {    
        RI=0;
        buffer[rev_num] = SBUF;
        rev_num += 1;
        if(rev_num > 6)
        {
            sign = rev_num;
            rev_num &= 0x00;
        }
    }
}

使用特权

评论回复
8
JJG| | 2007-4-9 10:49 | 只看该作者

51串口通信那么多人已经用了那么多年了,怎么会有问题.

肯定是你的程序有问题.

使用特权

评论回复
9
甄蔡组合| | 2007-4-9 11:20 | 只看该作者

高人都跑哪了 指点一下

小弟也想学学

使用特权

评论回复
10
hall919|  楼主 | 2007-4-9 13:33 | 只看该作者

7楼十分感谢,就是这个问题

 非常感谢帮助的网友!
  确实是这个问题,就是使用TI=0发送的时候,当发送完毕了,TI=1,也会触发interrupt 4中断,所以只能发第一个字符了,然后进入中断,接收的SBUF内容还是存着上次最后一个字符,也就是6,当出来的时候,在下一个指令周期,因为TI 还是1,所以又进入中断了,则buffer都是‘6’了。当TI=0时,可以发送了,但是发送的是‘6’,sign也一直是大于0的,所以就一直发送了。
 所以当系统中有发送和接收时,要判断RI和TI值。

使用特权

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

本版积分规则

9

主题

82

帖子

1

粉丝