求助,有关串口向单片机发送字符串的问题

douyu6210322 2011-06-16 11:40:24
这是我写的串口向单片机发送字符串的程序

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int

uchar ser_receive; //串口接收到的数据
uchar ser_flag=0;
uchar n,m,a,b;

sbit RXD_ = P3^0;

uchar xdata receive_number[256];//接收串口发送来的数据的数组
uchar TX_BUF[32];
uchar i=0;
uchar j;
uint l=0;
uchar come=0;
void init_ser()
{

TMOD=0X20;//定时器1工作在方式2
TH1=0XFD;
TL1=0XFD; //波特率9600
TR1=1;
EA=1;
SM0=0;
SM1=1;
REN=1;//允许串口接收
ES=1;//开串口 中断


}

/**************************************************
串口中断
/**************************************************/
void ser() interrupt 4
{
if(RI==1)
{
RI=0;
ser_receive=SBUF;
if(ser_receive!='\0')
{
receive_number[i]=ser_receive;
i++;
n=0;
while(n++>1500)
{
n++;
}
if((RXD_)&&(i<33))
{
l=i;
while(l<256)
{
receive_number[l]='\0';
l++;
}
a=i/32;
b=i%32;
l=0;
i=0;
ser_flag=1;
}
if((RXD_)&&(i>32)&&(i<65))
{
l=i;
while(l<256)
{
receive_number[l]='\0';
l++;
}
a=i/32;
b=i%32;
l=0;
i=0;
ser_flag=2;
}
if((RXD_)&&(i>64)&&(i<97))
{
l=i;
while(l<256)
{
receive_number[l]='\0';
l++;
}
a=i/32;
b=i%32;
l=0;
i=0;
ser_flag=3;
}
if((RXD_)&&(i>96)&&(i<129))
{
l=i;
while(l<256)
{
receive_number[l]='\0';
l++;
}
a=i/32;
b=i%32;
l=0;
i=0;
ser_flag=4;
}
if((RXD_)&&(i>128)&&(i<161))
{
l=i;
while(l<256)
{
receive_number[l]='\0';
l++;
}
a=i/32;
b=i%32;
l=0;
i=0;
ser_flag=5;
}
if((RXD_)&&(i>160)&&(i<193))
{
l=i;
while(l<256)
{
receive_number[l]='\0';
l++;
}
a=i/32;
b=i%32;
l=0;
i=0;
ser_flag=6;
}
if((RXD_)&&(i>192)&&(i<225))
{
l=i;
while(l<256)
{
receive_number[l]='\0';
l++;
}
a=i/32;
b=i%32;
l=0;
i=0;
ser_flag=7;
}
if((RXD_)&&(i>224)&&(i<257))
{
l=i;
while(l<256)
{
receive_number[l]='\0';
l++;
}
a=i/32;
b=i%32;
l=0;
i=0;
ser_flag=8;
}
}
}
}
void main()
{
init_ser();
while(1)
{
if(ser_flag==1)
{
ES=0;
ser_flag=0;
for(l=0;l<b;l++)
{
TX_BUF[l]=receive_number[l];
}
for(j=0;j<32;j++)
{
SBUF=TX_BUF[j];
while(!TI);
TI=0;
}
}
if(ser_flag==2)
{
ES=0;
ser_flag=0;
for(l=0;l<32;l++)
{
TX_BUF[l]=receive_number[l];
}
for(j=0;j<32;j++)
{
SBUF=TX_BUF[j];
while(!TI);
TI=0;
}
for(l=0;l<32;l++)
{
TX_BUF[l]=receive_number[l+32];
}
for(j=0;j<b;j++)
{
SBUF=TX_BUF[j];
while(!TI);
TI=0;
}
}
if(ser_flag==3)
{
ES=0;
ser_flag=0;
for(l=0;l<32;l++)
{
TX_BUF[l]=receive_number[l];
}
for(j=0;j<32;j++)
{
SBUF=TX_BUF[j];
while(!TI);
TI=0;
}
for(l=0;l<32;l++)
{
TX_BUF[l]=receive_number[l+32];
}
for(j=0;j<32;j++)
{
SBUF=TX_BUF[j];
while(!TI);
TI=0;
}
for(l=0;l<32;l++)
{
TX_BUF[l]=receive_number[l+64];
}
for(j=0;j<b;j++)
{
SBUF=TX_BUF[j];
while(!TI);
TI=0;
}
}
if(ser_flag==4)
{
ES=0;
ser_flag=0;
for(l=0;l<32;l++)
{
TX_BUF[l]=receive_number[l];
}
for(j=0;j<32;j++)
{
SBUF=TX_BUF[j];
while(!TI);
TI=0;
}
for(l=0;l<32;l++)
{
TX_BUF[l]=receive_number[l+32];
}
for(j=0;j<32;j++)
{
SBUF=TX_BUF[j];
while(!TI);
TI=0;
}
for(l=0;l<32;l++)
{
TX_BUF[l]=receive_number[l+64];
}
for(j=0;j<32;j++)
{
SBUF=TX_BUF[j];
while(!TI);
TI=0;
}
for(l=0;l<32;l++)
{
TX_BUF[l]=receive_number[l+96];
}
for(j=0;j<b;j++)
{
SBUF=TX_BUF[j];
while(!TI);
TI=0;
}
}
if(ser_flag==5)
{
ES=0;
ser_flag=0;
for(l=0;l<32;l++)
{
TX_BUF[l]=receive_number[l];
}
for(j=0;j<32;j++)
{
SBUF=TX_BUF[j];
while(!TI);
TI=0;
}
for(l=0;l<32;l++)
{
TX_BUF[l]=receive_number[l+32];
}
for(j=0;j<32;j++)
{
SBUF=TX_BUF[j];
while(!TI);
TI=0;
}
for(l=0;l<32;l++)
{
TX_BUF[l]=receive_number[l+64];
}
for(j=0;j<32;j++)
{
SBUF=TX_BUF[j];
while(!TI);
TI=0;
}
for(l=0;l<32;l++)
{
TX_BUF[l]=receive_number[l+96];
}
for(j=0;j<32;j++)
{
SBUF=TX_BUF[j];
while(!TI);
TI=0;
}
for(l=0;l<32;l++)
{
TX_BUF[l]=receive_number[l+128];
}
for(j=0;j<b;j++)
{
SBUF=TX_BUF[j];
while(!TI);
TI=0;
}
}
if(ser_flag==6)
{
ES=0;
ser_flag=0;
for(l=0;l<32;l++)
{
TX_BUF[l]=receive_number[l];
}
for(j=0;j<32;j++)
{
SBUF=TX_BUF[j];
while(!TI);
TI=0;
}
for(l=0;l<32;l++)
{
TX_BUF[l]=receive_number[l+32];
}
for(j=0;j<32;j++)
{
SBUF=TX_BUF[j];
while(!TI);
TI=0;
}
for(l=0;l<32;l++)
{
TX_BUF[l]=receive_number[l+64];
}
for(j=0;j<32;j++)
{
SBUF=TX_BUF[j];
while(!TI);
TI=0;
}
for(l=0;l<32;l++)
{
TX_BUF[l]=receive_number[l+96];
}
for(j=0;j<32;j++)
{
SBUF=TX_BUF[j];
while(!TI);
TI=0;
}
for(l=0;l<32;l++)
{
TX_BUF[l]=receive_number[l+128];
}
for(j=0;j<32;j++)
{
SBUF=TX_BUF[j];
while(!TI);
TI=0;
}
for(l=0;l<32;l++)
{
TX_BUF[l]=receive_number[l+160];
}
for(j=0;j<b;j++)
{
SBUF=TX_BUF[j];
while(!TI);
TI=0;
}
}
if(ser_flag==7)
{
ES=0;
ser_flag=0;
for(l=0;l<32;l++)
{
TX_BUF[l]=receive_number[l];
}
for(j=0;j<32;j++)
{
SBUF=TX_BUF[j];
while(!TI);
TI=0;
}
for(l=0;l<32;l++)
{
TX_BUF[l]=receive_number[l+32];
}
for(j=0;j<32;j++)
{
SBUF=TX_BUF[j];
while(!TI);
TI=0;
}
for(l=0;l<32;l++)
{
TX_BUF[l]=receive_number[l+64];
}
for(j=0;j<32;j++)
{
SBUF=TX_BUF[j];
while(!TI);
TI=0;
}
for(l=0;l<32;l++)
{
TX_BUF[l]=receive_number[l+96];
}
for(j=0;j<32;j++)
{
SBUF=TX_BUF[j];
while(!TI);
TI=0;
}
for(l=0;l<32;l++)
{
TX_BUF[l]=receive_number[l+128];
}
for(j=0;j<32;j++)
{
SBUF=TX_BUF[j];
while(!TI);
TI=0;
}
for(l=0;l<32;l++)
{
TX_BUF[l]=receive_number[l+160];
}
for(j=0;j<32;j++)
{
SBUF=TX_BUF[j];
while(!TI);
TI=0;
}
for(l=0;l<32;l++)
{
TX_BUF[l]=receive_number[l+192];
}
for(j=0;j<b;j++)
{
SBUF=TX_BUF[j];
while(!TI);
TI=0;
}
}
if(ser_flag==8)
{
ES=0;
ser_flag=0;
for(l=0;l<32;l++)
{
TX_BUF[l]=receive_number[l];
}
for(j=0;j<32;j++)
{
SBUF=TX_BUF[j];
while(!TI);
TI=0;
}
for(l=0;l<32;l++)
{
TX_BUF[l]=receive_number[l+32];
}
for(j=0;j<32;j++)
{
SBUF=TX_BUF[j];
while(!TI);
TI=0;
}
for(l=0;l<32;l++)
{
TX_BUF[l]=receive_number[l+64];
}
for(j=0;j<32;j++)
{
SBUF=TX_BUF[j];
while(!TI);
TI=0;
}
for(l=0;l<32;l++)
{
TX_BUF[l]=receive_number[l+96];
}
for(j=0;j<32;j++)
{
SBUF=TX_BUF[j];
while(!TI);
TI=0;
}
for(l=0;l<32;l++)
{
TX_BUF[l]=receive_number[l+128];
}
for(j=0;j<32;j++)
{
SBUF=TX_BUF[j];
while(!TI);
TI=0;
}
for(l=0;l<32;l++)
{
TX_BUF[l]=receive_number[l+160];
}
for(j=0;j<32;j++)
{
SBUF=TX_BUF[j];
while(!TI);
TI=0;
}
for(l=0;l<32;l++)
{
TX_BUF[l]=receive_number[l+192];
}
for(j=0;j<32;j++)
{
SBUF=TX_BUF[j];
while(!TI);
TI=0;
}
for(l=0;l<32;l++)
{
TX_BUF[l]=receive_number[l+224];
}
for(j=0;j<b;j++)
{
SBUF=TX_BUF[j];
while(!TI);
TI=0;
}
}
ES=1;
}
}
因为还要用到其他元件,每次只能发送32位,问题是发前面的255位都是正常的的,发第256位的时候,就出现问题了,只能发送最后的31位了,求大侠们帮小弟看看
...全文
146 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
douyu6210322 2011-06-16
  • 打赏
  • 举报
回复
1L
是255个字节!
net_friends 2011-06-16
  • 打赏
  • 举报
回复
255位是什么概念,32个字节不到
douyu6210322 2011-06-16
  • 打赏
  • 举报
回复
谢谢两位大侠,我已经解决了,uchar i=0;改成uint i=0;就可以了。哎!疏忽了!
douyu6210322 2011-06-16
  • 打赏
  • 举报
回复
3l
你说的这个,我已经改过了,那里只是需要很小的一点延时。
skylkj 2011-06-16
  • 打赏
  • 举报
回复
这程序看的我好纠结啊。。。

首先我承认我没看明白楼主到底是什么问题。

程序我看了一半,这排版实在看不下去了…………

先说说看到的问题:
1.

n=0;
while(n++>1500)
{
n++;
}

这个楼主是想做个延时? 完全无用啊…… n++<1500还差不多。而且循环里面还要再n++一次干嘛……

2.
l是个全局变量,你main里面靠它循环,中断里面也靠它,万一你main里面运行的时候来个中断,就全乱套了

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧