求助,AVR串口接收和发送字符串的问题!
现在串口接收和发送一个字符都可以了!
就是接收字符串不行,应该怎么处理呢?
看例程,发送字符串:
void str_send(char *s)
{
while(*s)
{
uart_sendB(*s);
s++;
}
}
但是接收怎么处理呢?用字符数组来保存?
请高手给个解译,谢谢!头疼中!!! 每次接收一个字节
存起来,连起来
自然就是字符串了 接受数据一般用中断,在中断函数里将每次接受的数据放在数组里,数组下标加1,接受完后数组存储的自然是发送的字符串了。例如
/*********************串口接收中断******************************/
#pragma interrupt_handler getchar:10
void getchar(void)
{
static unsigned char i;
inbox=UDR;
i++;
} 楼上正解 shuipaopao 发表于 2012-6-27 15:27 static/image/common/back.gif
接受数据一般用中断,在中断函数里将每次接受的数据放在数组里,数组下标加1,接受完后数组存储的自然是发 ...
我怎么把这几段语句复制进去,改一下中断函数,不能用呢?
接收不到数据!
我用串口调试助手发送,然后接收不到刚才发送的数据!
本帖最后由 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不可以!
到这里,就很不明白怎么接收串口的字符串到数组中???
请高手再帮忙 !!!
shuipaopao 发表于 2012-6-27 15:27 static/image/common/back.gif
接受数据一般用中断,在中断函数里将每次接受的数据放在数组里,数组下标加1,接受完后数组存储的自然是发 ...
再仔细看了看,怎么中断用向量号为10的中断???
这个是定时器/计数器0 溢出 中断! 顶一下,希望高手给个解答!!!
用百度搜了半天,没啥结果! --> DDRD|=0X02; //配置TX为输出(很重要)
從來都無設定 !
void uart_rx(void) //中断函数,接收字符串(按照楼上写的)
{
static uchar i;
rdata=UDR; //???????
i++;
}
rdata = UDR ; 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 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++;
}
但是按照上面这样写,串口发出的字符串,接收不到!
请各位知道的来看看,这个问题对高手来说很简单!
晕,有代码有关啊,还是截图吧:
void str_send(char *s)//发送字符串
{
while(*s)
{
uart_sendB(*s);
delay(2000) ; //加 --> 1 Second //得就減少
s++;
}
} 將 Rx 短接 Tx 試試
自己傳自己 blueice2011 发表于 2012-6-27 19:06 static/image/common/back.gif
我怎么把这几段语句复制进去,改一下中断函数,不能用呢?
接收不到数据!
我只是举了个例子,楼主不应该照搬,中断向量各个型号的单片机不尽相同,用时需要查数据手册。 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......
不知道这是什么原因,高手再帮忙给分析一下!!!
谢谢!
我在搞串口也苦恼了很久,现在还是不行,发送一串字符串,只能进入两次中断就吐出来了。不知道是什么回事。 我现在也是苦恼接收字符串的问题哎怎么搞不定呢?
qq:150216708 blueice2011 发表于 2012-6-28 09:59 static/image/common/back.gif
不好意思,这个复制的时候错了!
DDRD|=0X02; 这个是配置端口输入输出的
楼主啊,我发送没问题。就是接收程序的时候,感觉程序会跑偏了,死机了。
感觉是接受中断那边的问题 是不是有什么标志位没清零?
楼主可以给我你的程序参考下吗?
百度真的都没有。 好像都没有定义接收中断啊。UART的接送中断和发送中断定义码不一样的.
页:
[1]