本帖最后由 lanfengxun 于 2012-9-17 11:33 编辑
/*************************串口初始化*******************************************/
void Inituart()
{
IE=0x90; //打开中断总开关及串口中断开关
SCON = 0x50; //设定串行口工作方式1 允许接受
TMOD = 0x20; //定时器1,自动重载, 产生波特率
// PCON=0x80; // 加上他后波特率是19200 SMOD为1
TL1 = 0xfa;
TH1 = 0xfa; //波特率为9600 ,221184MHz
TR1 = 1;
}
/**************************接收上位机传送数据***************************************/
void uart_js() interrupt 4 //RI==1时执行串口中断
{
uchar static i ;
if(RI==1)
{
RI=0;
RX_BUF= SBUF; //保存数据
i++;
}
if(i==10)
{
i=0;
RXend = 1;
LED0=0; //LED长亮
}
}
void main()
{
uchar j;
Inituart();
while(1)
{
while(RXend==0); //waiting receive end
RXend=0;
for(j=0;j<10;j++)
{
TxBuf[j] = RX_BUF[j]; //将需发送数据存入无线发送缓冲区
}
}
}
利用串口助手,从上位机向单片机一次发送十个字节,单片机无法接收到,因为灯没亮。请问哪位知道什么原因,实在调试不出来了,跪求!!!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
你好 我正在找这种判断方式 我想问你下 如果我接收到的数据是多位的 尾数的数据还是用来设置用的 请问下 我可以怎么处理呢
多字节数组可以考虑以帧的格式来发送/接收。
比如定义帧格式如下:
引导码+帧长度+帧长度+重复引导码+数据0+数据1.+。。。。数据n+校验高字节+校验低字节+结束码
设引导码=0xaa
帧长度=len
结束码=0xbb
串口中断接收函数如下:
void UART_interrupt() interrupt 4 using 2
{ unsigned char dat;
if(RI)
{ dat=SBUF;
RI=0;
}
if(dat==0xaa)//接收到第一个0xaa 帧头
{ Recv_start_flag=1;//开始接收位
}
if(dat==0xbb)//接收到帧尾
{ Recv_start_flag=0;//
dat_buff[Recvcount]=dat;//保存帧尾
Recvcount=0;
Recv_end_flag=1;//帧接收结束位 在主程序中用此位判断是否进行数据解析
}
if(Recv_start_flag)//开始接收
{ dat_buff[Recvcount]=dat;//保存接收的数据
Recvcount++;
if( Recvcount>n)//n数组的长度 防止接收的数据超长
{ Recvcount=0;
Recv_start_flag=0;
}
if(Recvcount==5)//已经接收了6个数据,判断帧格式是否正常
{ if((dat_buff[0]!=dat_buff[3])&&(dat_buff[1]!=dat_buff[2]))//帧格式不对
{ Recvcount=0;//清接收计数器
Recv_start_flag=0;
}
}
}
}
一周热门 更多>