本帖最后由 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]; //将需发送数据存入无线发送缓冲区
}
}
}
利用串口助手,从上位机向单片机一次发送十个字节,单片机无法接收到,因为灯没亮。请问哪位知道什么原因,实在调试不出来了,跪求!!!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
void uart_rx_isr(void) //接收中断函数
{
uchar c;
c=SBUF;//c等于接收的字节;
switch (recv_state)
{
case 0:
if (c==0x02) // 是数组第一字节
{
recv_state=1; // 进入下一个状态
}
else
recv_state=0; // 回到初始状态
break;
case 1:
if (c!=0xff) // 是数组第二字节 拢共 3位数据 中间这位 为数据位 就不进行校验判断了
{
recv_state=2; // 进入下一个状态
Rx_Data=SBUF; //把 这个数据 纪录下来 作为 后面的判断
}
else
{
recv_state=0; // 回到初始状态
}
break;
case 2:
if (c==0x03) // 是数组第三字节
{
// recv_state=3; // 进入下一个状态
Flag=1;
recv_state=0; // 回到初始状态
}
else
{
recv_state=0; // 回到初始状态
}
break;
}
}
void UART_interrupt() interrupt 4
{
if(RI==1)//如果接收了数据(RI会置1)
{
RI=0; //先清零,下次可以在接收数据
uart_rx_isr(); //调用数据判断这个函数
}
}
一周热门 更多>