c51,单片机从串口接收字符串,放到一个数组里面,然后在通过串口发出去。急!谢谢

 我来答
枫之将至
2011-08-24
知道答主
回答量:11
采纳率:0%
帮助的人:12.7万
展开全部

#include <reg52.h>

#define uchar unsigned char

#define uint unsigned int

uchar data table[10]; //暂存数组,可以将10改为你需要的数值

/***********************************************

串行口初始化波特率9600,定时器1,工作方式2   *************************************************/

void serial_init(void)

TMOD=0x20;//计时器1作为比特率发生器,方式2

TH1=0xfd; 

TL1=0xfd; //装入初值

TR1=1;//计时中断允许

SM0=0;

SM1=1;//串行口工作于方式2

ES=1;//串行口中断允许

REN=1;//接收允许

EA=1;// 总中断允许

}

/********************* **************************    

串行口传送数据

         传送显示数组各字符给计算机

*************************************************/

void send(uchar *dis)

{

while(*dis!='\0')

  {

     SBUF=*dis;

 dis++;

     while(!TI);

     TI=0; //软件请发送中断

 }   

}   

    

void main()

{

 serial_init();//初始化

 while(SBUF!=0x0d);//计算机键盘按下回车键,则开始将接收到的数据回传给计算机

 send(table);

}

/***********************************************

串行中断服务函数

单片机接收数据,存入table数组

*************************************************/

void serial() interrupt 4

{

 int i;

 ES=0; //关串口中断

 table[i++]=SBUF;//命令存到命令数组

 RI=0; //软件清除接收中断

 

 ES=1;//开串口中断

 }

已经通过proteus仿真如下

ch314156
2011-08-24 · TA获得超过4377个赞
知道小有建树答主
回答量:2036
采纳率:100%
帮助的人:1062万
展开全部
avr单片机的缓冲区串口收发,别的单片机 你改一下寄存器就行

//芯片:mega16

#include <ioavr.h>
#define F 8000000
#define BAUD 9600

#define u8 unsigned char
#define u16 unsigned int
#define u32 unsigned long

void usart_init(void);
char get_char(void);
void put_char(char c);

#define RX_SIZE 20
#define TX_SIZE 20

char rx[RX_SIZE];
u8 rx_head,rx_rear,rx_overflow;

char tx[TX_SIZE];
u8 tx_head,tx_rear,tx_overflow;

int main(void)
{
usart_init();
put_char( 'a' );
put_char( 'b' );
put_char( 'c' );
put_char( 'd' );
put_char( 'e' );
while(1)
put_char(get_char());
}

void usart_init(void)
{
UCSRB = (1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN);//接收结束中断使能,发送结束中断使能,接收允许,发送允许
UCSRC = 0X86; //选择UCSRC,异步模式,无校验,1位停止位,8位数据位
UBRRH = (F/16/BAUD - 1)>>8; //选择UBRRH,设置波特率
UBRRL = (unsigned char)(F/16/BAUD - 1);

rx_head = 0;
rx_rear = 0;
rx_overflow = 0;

tx_head = 0;
tx_rear = 0;
tx_overflow = 0;

asm("sei");
}

char get_char(void)
{
char c;
while(rx_head == rx_rear);//如果接收缓冲区空,则一直等待
c = rx[rx_head++]; //从头取数据,头+1
if(rx_head >= RX_SIZE ) rx_head = 0;//若头超出缓冲区末端,移至缓冲区开端
return c;
}

void put_char(char c)
{
if(tx_head != tx_rear || !( UCSRA&(1<<UDRE) ) )//若 发送缓冲区非空 或 发送寄存器非空
{
tx[tx_rear++] = c;//将c移至缓冲区尾,尾+1
if(tx_rear >= TX_SIZE ) tx_rear = 0;//若尾超出缓冲区末端,移至缓冲区开端
if(tx_rear == tx_head)//若尾前进到头,说明缓冲区满
{
tx_overflow = 1;//缓冲区溢出 (事实上刚好不溢出,这里为了编程方便,牺牲一个字节并记为溢出)
tx_head++;//牺牲最早接收的那个字节
}
}
else
UDR = c;//直接发送
}

#pragma vector = USART_RXC_vect
__interrupt void receive(void)
{
rx[rx_rear++] = UDR;
if(rx_rear >= RX_SIZE ) rx_rear = 0;//若尾超出缓冲区末端,移至缓冲区开端
if(rx_rear == rx_head)//若尾前进到头,说明缓冲区满
{
rx_overflow = 1;//缓冲区溢出 (事实上刚好不溢出,这里为了编程方便,牺牲一个字节并记为溢出)
rx_head++;//牺牲最早接收的那个字节
}
}

#pragma vector = USART_TXC_vect
__interrupt void transmit(void)
{
if(tx_head != tx_rear)//如果发送缓冲区非空
{
UDR = tx[tx_head++];//发送头数据,头+1
if(tx_head >= TX_SIZE) tx_head = 0;//若头超出缓冲区末端,移至缓冲区开端
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
我是_罗东
2011-08-26 · TA获得超过372个赞
知道小有建树答主
回答量:147
采纳率:0%
帮助的人:90.5万
展开全部
竞争真大a
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
702htme430
2011-08-24 · TA获得超过695个赞
知道答主
回答量:528
采纳率:0%
帮助的人:320万
展开全部
改用查询的方式接收试试:

例如:

if(RI)
{
for(i=0;i<4;i++)
{
while(!RI); //查询接收标志
RI=0;
shou_shu[i]=SBUF; //创建一个4元素的数组

}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
47okey
2011-08-24 · TA获得超过1.2万个赞
知道大有可为答主
回答量:5900
采纳率:75%
帮助的人:2355万
展开全部
字符串的字符个数固定的吗?
追问
个数不固定,最长218个字节。最后一个为前面所有字节的异或校验和。
追答
个数不固定,还没不知怎么处理,在此学习。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 3条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式