#include <iom16v.h>
#include <macros.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define mclk 8000000
#define uchar unsigned char
#define uint unsigned int
#pragma interrupt_handler uart_rx:12
uchar rdata;
uchar flag=0;
//异步串行通信寄存器配置的初始化子函数
void uart_init(uint baud)
{
UCSRB=0x00;
UCSRA=0x00; //控制寄存器清零
UCSRC=(1<<URSEL)|(0<<UPM0)|(3<<UCSZ0);
//选择UCSRC,异步模式,禁止
// 校验,1位停止位,8位数据位(0X86)
baud=mclk/16/baud-1; //波特率最大为65K
UBRRL=baud;
UBRRH=baud>>8; //设置波特率
UCSRB=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE);
//接收、发送使能,接收中断使能(0X98)
SREG=BIT(7); //全局中断开放(0X80)
DDRD|=0X02; //配置TX为输出(很重要)
}
//发送数据子函数
void uart_sendB(uchar data)
{
while(!(UCSRA&(BIT(UDRE)))) ; //查询UCSRA的数据寄存器是否为空,即是否准备好接受新的数据,为空时(UDRE=1)准备发送数据
UDR=data;
while(!(UCSRA&(BIT(TXC)))); //查询UCSRA的数据寄存器是否发送结束
UCSRA|=BIT(TXC); //查询写1操作将TXC清零
}
void uart_sendstr(uchar*sendpt)
{
while(*sendpt) //字符串未结束则继续发送
{
uart_sendB(*sendpt++);
}
}
uchar uart_rx()
{
UCSRB&=~BIT(RXCIE); //关中断
rdata=UDR;
flag=1;
UCSRB|=BIT(RXCIE);
}
void main()
{
uint i;
char sp[3],lx[1],ly[1],cx1[1],cy1[1],cx2[1],cy2[1];
char tdata[]="123456";
uart_init(19200);
while(1)
{
if(flag)
{
uart_sendstr(tdata);
for(i=0;i<3;i++)
sp[i]=tdata[i];
uart_sendstr(sp);
for(i=0;i<1;i++)
lx[i]=tdata[i+3];
for(i=0;i<1;i++)
ly[i]=tdata[i+4];
for(i=0;i<1;i++)
cx1[i]=tdata[i+5];
for(i=0;i<1;i++)
cy1[i]=tdata[i+6];
for(i=0;i<1;i++)
cx2[i]=tdata[i+7];
for(i=0;i<1;i++)
cy2[i]=tdata[i+8];
flag=0;
}
}
}
运用串口调试助手发现,数组sp[]的元素和tdata 一样,按说不应该啊,我只是把tdata的前三个元素赋给了sp,怎么回事啊?