L勇 发表于 2012-10-23 15:20:16

yurinacn 发表于 2012-10-23 15:28:11

本帖最后由 yurinacn 于 2012-10-23 15:44 编辑

unsignedchara;
unsigned char *pA;
unsigned char count;

void ser() interrupt 4
{
    if (RI)
    {
      if(count)
      {
            count--;
            *pA++ = SBUF;
      }
      else
      {
             count = SBUF;//未检查count可能超过数组a大小
             pA = a;
      }
    }
}

大概就是这个意思,可能不对,急着走

Eric_Xue 发表于 2012-10-23 19:35:11

本帖最后由 Eric_Xue 于 2012-10-23 19:36 编辑

在串口中断程序中加上发送字符的程序,接一个发一个,然后用串口调试助手看接受的数据是否正确。
    主要看len,还有楼主注意是以字符形式发的还是十六进制的。比如发数字"3":十六进制是"0x03",字符是0x33
       一次读中断不要读两次Sbuf,第二次读的可能不正确吧,改为len=sbuf;a=len;
       初始化和读完数据各个全局变量要设置好。比如初始化flag应该设置为0,len设置为0。接收完数据k应该设置为0吧,不然串口又有数据读进来改怎么办啊。

L勇 发表于 2012-10-23 23:34:47

L勇 发表于 2012-10-23 23:35:14

L勇 发表于 2012-10-23 23:35:41

eduhf_123 发表于 2012-10-24 00:10:44

unsigned char idata a;
unsigned char k=0, len, flag=0;        //用char就足够了

void ser() interrupt 4
{
        if(RI)
        {
                switch(k)
                {
                        case 0:
                                len=SBUF;
                                //对SBUF的重复读取可能造成预料以外的结果
                                //如果想将len放入a存放,应该用变量len对a进行赋值
                                a=SBUF;
                                RI=0;
                                //下一行原来是冒号结尾,将被识别成标号而非可执行语句
                                k++;
                        break;
                        default:
                                a=SBUF;
                                RI=0;
                                //下一行原来是冒号结尾,将被识别成标号而非可执行语句
                                k++;
                                if(len==k)
                                        flag=1;
                }
        }
}

L勇 发表于 2012-10-24 00:18:24

eduhf_123 发表于 2012-10-24 00:18:38

本帖最后由 eduhf_123 于 2012-10-24 00:21 编辑

如果是我,我会这么做:unsigned char idata a;
unsigned char k=0, flag=0;

void ser() interrupt 4
{
        if(RI)
        {
                RI = 0;

                //本次数据未处理完之前,不再接收新数据
                if(!flag)
                {
                        a = SBUF;
                        if(k == a)
                        {
                                flag = 1;
                        }
                }
        }
        else
        {
                TI = 0;
        }
}

L勇 发表于 2012-10-24 22:38:20

liudaolunhui 发表于 2012-10-24 23:36:15

果然有高手!!!!!!!!!!

zhenglu891028 发表于 2012-10-25 04:40:19

學習了{:smile:}

eduhf_123 发表于 2012-10-25 10:30:43

L勇 发表于 2012-10-24 22:38 static/image/common/back.gif
else
       {

            TI = 0;//这位大哥,这句在程序中有什么作用啊

    }

能执行到这里,是否说明有串口中断发生了?

能执行到“else”这里,是否说明“if()”里的判断条件不成立?也就是说,是否说明本次串口中断服务是由TI引起的?

如果我们放任这个TI标志不管,你想想会发生什么情况?

L勇 发表于 2012-10-25 13:05:41

页: [1]
查看完整版本: 感觉有难度,请高手指点,thanks