blueice2011 发表于 2012-6-27 11:18:56

求助,AVR串口接收和发送字符串的问题!


现在串口接收和发送一个字符都可以了!

就是接收字符串不行,应该怎么处理呢?

看例程,发送字符串:
void str_send(char *s)
{
while(*s)
{
uart_sendB(*s);
s++;
}
}

但是接收怎么处理呢?用字符数组来保存?

请高手给个解译,谢谢!头疼中!!!

leebilly007 发表于 2012-6-27 13:13:51

每次接收一个字节
存起来,连起来
自然就是字符串了

shuipaopao 发表于 2012-6-27 15:27:28

接受数据一般用中断,在中断函数里将每次接受的数据放在数组里,数组下标加1,接受完后数组存储的自然是发送的字符串了。例如
/*********************串口接收中断******************************/
#pragma interrupt_handler getchar:10
void getchar(void)
{
static unsigned char i;
inbox=UDR;
i++;
}

xjbh001 发表于 2012-6-27 16:06:36

楼上正解

blueice2011 发表于 2012-6-27 19:06:47

shuipaopao 发表于 2012-6-27 15:27 static/image/common/back.gif
接受数据一般用中断,在中断函数里将每次接受的数据放在数组里,数组下标加1,接受完后数组存储的自然是发 ...

我怎么把这几段语句复制进去,改一下中断函数,不能用呢?

接收不到数据!

我用串口调试助手发送,然后接收不到刚才发送的数据!

blueice2011 发表于 2012-6-27 19:23:37

本帖最后由 blueice2011 于 2012-6-27 19:25 编辑

我发一下我的程序(程序很乱)和电路图:

电路图:(用PROTEUS仿真,串口已经设定没有问题,主要问题在程序上)


部分程序如下:
#include <iom16v.h>
#include <macros.h>
#defineuchar unsigned char
#defineuintunsigned int

#definemclk   8000000
#pragma interrupt_handler uart_rx:12
uchar flag=0,rdata[];

void uart_init(uint baud)
{
    UCSRB=0x00;
    UCSRA=0x00;                   //控制寄存器清零
    UCSRC=(1<<URSEL)|(0<<UPM0)|(3<<UCSZ0);   //选择UCSRC,异步模式,禁止校验,1位停止位,8位数据位

    baud=mclk/16/baud-1        ;   //波特率最大为65K
    UBRRL=baud;                                                        
    UBRRH=baud>>8;                    //设置波特率
    UCSRB=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE);//接收、发送使能,接收中断使能
    SREG=BIT(7);                      //全局中断开放
    DDRD|=0X02;                      //配置TX为输出(很重要)
}

void uart_sendB(uchar data)//发送一个字符
{
    while(!(UCSRA&(BIT(UDRE)))) ; //等待数据寄存器空
    UDR=data;
}

void str_send(char *s)//发送字符串
{
   while(*s)
   {
      uart_sendB(*s);
      s++;
   }
}

void uart_rx(void)   //中断函数,接收字符串(按照楼上写的)
{
    static uchar i;
    rdata=UDR;
    i++;
}


void main()//主函数
{
          uint i;
          DDRB=0XFF;
          DDRD|=BIT(4)|BIT(5)|BIT(6);
          PORTD&=~BIT(6);
          
          lcd_init();
       
       
      uart_init(19200);
        while(1)
        {
           if(flag)
           {
                str_send(rdata); //发送接收到的字符串
                flag=0;
           }
          
        }       
}

我这个程序,本来是想要把从串口接收到的字符串,在LCD屏上显示出来(上面没贴LCD显示的程序),然后断送接收到的字符是不是保存的字符串相同。

但是问题是:现在接收不到从串口发送的字符串,字符串得保存在数组里面才能比较是否相同。

按照楼上的程序我改了接收字符串那段,但是改了后,还是接收不到字符串?

我原来用另外一段接收字符串程序,能接收到字符串,并发送到串口调试助手窗口中,但是那个程序好像是接收一个字符,发送一个字符。没法比较。而且把接收到的字符要显示在LCD上,在LCD上显示不正确,只有第一个字符,后面的是空格,然后串口调试助手中接收到的字符也只有第一个!

那段代码如下:
void uart_rx() //中断函数、接收数据
{
    uint i;
        UCSRB&=~BIT(RXCIE); //关闭USART中断
        while(UCSRA&(BIT(RXC)))
        {
                for(i=0;i<2;i++)
                {
                        rdata=UDR;
                }
        }
               
        flag=1;
        UCSRB|=BIT(RXCIE); //打开USART中断
}

上面这段代码,只要i<2,这个把2改成2以上的数字结果都一样,很不明白,但是1不可以!


到这里,就很不明白怎么接收串口的字符串到数组中???

请高手再帮忙 !!!


blueice2011 发表于 2012-6-27 19:28:03

shuipaopao 发表于 2012-6-27 15:27 static/image/common/back.gif
接受数据一般用中断,在中断函数里将每次接受的数据放在数组里,数组下标加1,接受完后数组存储的自然是发 ...

再仔细看了看,怎么中断用向量号为10的中断???

这个是定时器/计数器0 溢出 中断!

blueice2011 发表于 2012-6-27 22:56:30

顶一下,希望高手给个解答!!!

用百度搜了半天,没啥结果!

easier 发表于 2012-6-27 23:59:17

--> DDRD|=0X02;                        //配置TX为输出(很重要)

                   從來都無設定 !


void uart_rx(void)   //中断函数,接收字符串(按照楼上写的)
{
    static uchar i;
    rdata=UDR;      //???????
    i++;
}

          rdata = UDR ;

easier 发表于 2012-6-28 00:02:48

void uart_rx() //中断函数、接收数据
{
    uint i;
      UCSRB&=~BIT(RXCIE); //关闭USART中断               <----多餘
      while(UCSRA&(BIT(RXC)))                                       <----多餘
      {
                for(i=0;i<2;i++)                                                          <----多餘
                {
                        rdata=UDR;
                }
      }
               
      flag=1;
      UCSRB|=BIT(RXCIE); //打开USART中断      <----多餘
}

blueice2011 发表于 2012-6-28 09:59:55

本帖最后由 blueice2011 于 2012-6-28 10:01 编辑

easier 发表于 2012-6-27 23:59 static/image/common/back.gif
--> DDRD|=0X02;                        //配置TX为输出(很重要)

                   從來都無設定 !


不好意思,这个复制的时候错了!

DDRD|=0X02;   这个是配置端口输入输出的

这段应该是:

void uart_rx(void)
{
        static uchar i;
        rdata=UDR;
        i++;
}

但是按照上面这样写,串口发出的字符串,接收不到!


请各位知道的来看看,这个问题对高手来说很简单!

晕,有代码有关啊,还是截图吧:


easier 发表于 2012-6-28 15:54:32

void str_send(char *s)//发送字符串
{
   while(*s)
   {
      uart_sendB(*s);
               delay(2000) ; //加 --> 1 Second //得就減少
      s++;
   }
}

easier 发表于 2012-6-28 15:57:47

將 Rx 短接 Tx 試試

自己傳自己

shuipaopao 发表于 2012-6-28 18:48:43

blueice2011 发表于 2012-6-27 19:06 static/image/common/back.gif
我怎么把这几段语句复制进去,改一下中断函数,不能用呢?

接收不到数据!


我只是举了个例子,楼主不应该照搬,中断向量各个型号的单片机不尽相同,用时需要查数据手册。

blueice2011 发表于 2012-6-28 21:47:46

shuipaopao 发表于 2012-6-28 18:48 static/image/common/back.gif
我只是举了个例子,楼主不应该照搬,中断向量各个型号的单片机不尽相同,用时需要查数据手册。 ...

我知道我问题出在那儿了

这段代码:
while(1)
      {
         if(flag)
         {
                str_send(rdata); //发送接收到的字符串
                flag=0;
         }

变量flag,我之前接收字符串的时候,没有将flag值1.我修改完了以后,能接收到字符,把字符往LCD上显示也可以.

不过现在出现新的问题:
用串口调试助手发送11个字符串,然后再发回串口助手,并且在LCD上显示接收到的字符.但是,第一个发送的时候,LCD显示正确,但是串口接收到的只是字符串的第一个字符.再发送一次后,LCD显示和串口接收到都正常了.
将字符串改变后发送,发现一个问题,就是,发送的时候LCD上显示的是发送的字符,但是串口接收到的是上一次发送的字符.把字符再改变后发送,LCD始终显示正确,串口接收到的都是上一次发送的.
比如,发送A1,LCD显示A1,串口显示A,再发送A2,LCD显示A2,串口显示A1,发送A3,LCD显示A3,但串口显示A2......

不知道这是什么原因,高手再帮忙给分析一下!!!

谢谢!

wensheng18 发表于 2013-1-7 18:19:12

我在搞串口也苦恼了很久,现在还是不行,发送一串字符串,只能进入两次中断就吐出来了。不知道是什么回事。

feifeimao 发表于 2013-6-18 15:20:48

我现在也是苦恼接收字符串的问题哎怎么搞不定呢?
qq:150216708

Danylove 发表于 2013-8-11 17:32:32

blueice2011 发表于 2012-6-28 09:59 static/image/common/back.gif
不好意思,这个复制的时候错了!

DDRD|=0X02;   这个是配置端口输入输出的


楼主啊,我发送没问题。就是接收程序的时候,感觉程序会跑偏了,死机了。
感觉是接受中断那边的问题 是不是有什么标志位没清零?
楼主可以给我你的程序参考下吗?
百度真的都没有。

dickchen86 发表于 2013-8-12 11:41:39

好像都没有定义接收中断啊。UART的接送中断和发送中断定义码不一样的.
页: [1]
查看完整版本: 求助,AVR串口接收和发送字符串的问题!