返回该小组首页 回复主题
wuyunxiang617

wuyunxiang617

小组等级:     E币:155  (E币换礼)

#1楼主:cc2430上串口通信问题

文章发表于:2008-07-06 02:51

INTERRUPT_FUNC urx0_service_IRQ(void){

   BYTE x,y;
   BYTE length;
   BYTE data[16];
   BYTE i;
   BYTE check;

   y = U0DBUF;
   if (y=='a')
   {
     conPrintROMString("cl!\n");
      while (!URX0IF);
     length = U0DBUF-'0';
      conPrintROMString("x!\n");
     URX0IF = FALSE;

     for(i=0;i<length-2;i++)
     {
       while (!URX0IF);
        data[i] = U0DBUF;
        conPrintROMString("y\n");
        URX0IF = FALSE;
     }

      serio_rxHead++;
     serio_rxBuff[serio_rxHead] ='a';
      conPrintUINT8(serio_rxBuff[serio_rxHead]);
     serio_rxHead++;
     serio_rxBuff[serio_rxHead] =length;
     conPrintUINT8(serio_rxBuff[serio_rxHead]);

     for(i=0;i<length-2;i++)
     {
     serio_rxHead++;
     serio_rxBuff[serio_rxHead] =data[i];
     conPrintUINT8(serio_rxBuff[serio_rxHead]);
     }
     conPrintROMString("\nhandsome!");

   }
}

上面是我的串口中断程序,我的问题是:

当我用串口调试助手分开向串口发送a,4,1,2时串口输出为:

cl!
x!
y
y
0x610x040x310x32
handsome!

这个答案是正确的.但是当我用串口助手一次性发送a412时,串口输出为:

cl!
x!
0x610x02
handsome!

我想要的结果应该也是第一种.请问程序中哪里有问题?先谢谢大家了!

 

wuyunxiang617

   小组等级:    E币:155  (E币换礼)

#2

文章发表于:2008-07-06 14:54

conPrintROMString("cl!\n");

conPrintUINT8(serio_rxBuff[serio_rxHead]);

都是从串口输出的意思.

emot

   小组等级:    E币:1152  (E币换礼)

#3

文章发表于:2008-07-07 09:13

对比你的结果:

输入:a        4        1        2

输出1:

cl!
x!
y
y
           0x61   0x04   0x31  0x32
handsome!

输出2:

cl!
x!
NULL
NULL
          0x61     0x02   NULL   NULL
handsome!

输出2比输出1少了4个字节,图中用NULL示出,在分开输入时,可以得到你想要的结果,但在一次性串口输入“a412”,CC2430不会输出你期望的数据,只因CC2430处理不过来了。对比两次输出的16进制数就会知道这一点,0x61是‘a’,后面绿色的字节却不一样,输出1为4,对应你输出的‘4’,而输出2是‘2’,对应的是"a412"的‘2’,可见CC2430没有收到中间的两个字节,输出当然不符合要求了。

对于输出2来说,在for(;;)中,2-2=0,0不小于0,并不会去查询URX0IF,也不会接收后面的数,而是跳过两个循环直接输出“handsome!"了。

[建议]不要在中断程序里做这么多的事情。

 

wuyunxiang617

   小组等级:    E币:155  (E币换礼)

#4

文章发表于:2008-07-08 10:37

谢谢 emot了,请问如果通过串口接收各种命令(有特定的格式)的话,是不是在串口中断程序函数中按相应的协议每次接收一个字节处理吗 ? 还是应该在在串口中断程序函数中每次接收一帧(多字节)在做相应的处理拉?有相关经验的希望给点建议.先谢谢大家了!

emot

   小组等级:    E币:1152  (E币换礼)

#5

文章发表于:2008-07-08 13:43

可以在串口接收中断中启动TIMER,一次接收多个字节,超时退出。也可以每次中断接收一个字节。

然后在外部分程序中作比较等处理。

wangcong8197

   小组等级:    E币:153  (E币换礼)

#6

文章发表于:2008-07-09 12:37

启动定时器,可以接收多个字节嘛?串口不是来个字节,就产生一次中断的,进入一次中断服务程序的?启动定时器,可以接收多个字节,效率就高了,这样当然好,可程序应该怎么写?讲下大概思路

kongwx

   小组等级:    E币:85  (E币换礼)

#7

文章发表于:2008-07-09 23:22

我想用CC2430模拟串口实现与C51的两机通讯,不知道如何实现,能给一个指导吗,具体的编程不用。谢谢了,新手请多指教

emot

   小组等级:    E币:1152  (E币换礼)

#8

文章发表于:2008-07-10 12:38

6#,进入UARTRX中断以后,打开定时器,如果在一定时间内没有收到数据则退出。退出后再对数据作其他操作。

7#,CC2430也有串口,不用模拟。

kongwx

   小组等级:    E币:85  (E币换礼)

#9

文章发表于:2008-07-17 20:59

点击看大图

我自己焊了个串口,输出电压试0-0.6,好像CC2430没有反应,不知道要多大电压才会产生串口中断,这个板的VCC试3.6V,还有串口电路图载附件,麻烦帮帮忙改一下,谢谢了,请赐教。

总共 , 当前 /

快速回复主题--如果想加入编辑器功能,建议使用 [高级回复]

您目前还不是小组成员,请先加入

回复贴子区

用户名:    您没有注册?

密码:    忘记了密码?

内容:

  • DesignDesign
  • HTMLHTML

浏览该小组的用户还看过...

所有小组精华文章