感觉有难度,请高手指点,thanks

2020-02-02 09:38发布

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

unsigned  char  a[10];
unsigned char *pA;
unsigned char count;

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

大概就是这个意思,可能不对,急着走
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
yurinacn
1楼-- · 2020-02-02 10:54
本帖最后由 Eric_Xue 于 2012-10-23 19:36 编辑

在串口中断程序中加上发送字符的程序,接一个发一个,然后用串口调试助手看接受的数据是否正确。
    主要看len,还有楼主注意是以字符形式发的还是十六进制的。比如发数字"3":十六进制是"0x03",字符是0x33
       一次读中断不要读两次Sbuf,第二次读的可能不正确吧,改为len=sbuf;a[0]=len;
       初始化和读完数据各个全局变量要设置好。比如初始化flag应该设置为0,len设置为0。接收完数据k应该设置为0吧,不然串口又有数据读进来改怎么办啊。
  
Eric_Xue
2楼-- · 2020-02-02 13:21
 精彩回答 2  元偷偷看……
L勇
3楼-- · 2020-02-02 15:35
本帖最后由 eduhf_123 于 2012-10-24 00:21 编辑

如果是我,我会这么做:
  1. unsigned char idata a[10];
  2. unsigned char k=0, flag=0;

  3. void ser() interrupt 4
  4. {
  5.         if(RI)
  6.         {
  7.                 RI = 0;

  8.                 //本次数据未处理完之前,不再接收新数据
  9.                 if(!flag)
  10.                 {
  11.                         a[k++] = SBUF;
  12.                         if(k == a[0])
  13.                         {
  14.                                 flag = 1;
  15.                         }
  16.                 }
  17.         }
  18.         else
  19.         {
  20.                 TI = 0;
  21.         }
  22. }
复制代码
L勇
4楼-- · 2020-02-02 21:05
果然有高手!!!!!!!!!!
L勇
5楼-- · 2020-02-02 22:29
學習了
eduhf_123
6楼-- · 2020-02-03 02:43
L勇 发表于 2012-10-24 22:38
else
       {

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

    }


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

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

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

一周热门 更多>