3033|4

90

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

谁帮我看看这个串口的部分程序 谢谢 [复制链接]

这是串口通信程序 在书抄下来的 其中一部分是这样的  发送请求信号0xaa 等待响应0xbb
         do
        {
                SBUF=Send_Inf;                ///发送联络信号 aa
                while(TI==0);           //确认发送完了
                TI=0;              //复位
                while(RI==0);              //等待响应
                RI=0;                     //复位
        }while((SBUF^0xbb)!=0);         //判断是否为同意通信信号
但我用串口调试的时候 总是循环 也就是说这个SBUF^0xbb不起作用!为什么呢?

还有一个
i=serial_receive();//调用接收子程序,接收数据
unsigned char serial_receive(void)
{
while(RI==0);//等待接收数据
RI=0;//接收到数据,清除接收完毕标志
return(SBUF);//返回接收数据
}

串口调试结果:运行了i=serial_receive();这条语句后,那个i是不会变的 总是0x00;就是接收不了传来的值!这又是为什么?

最新回复

开串口中断啊,用中断方式多方便哈。  详情 回复 发表于 2007-4-2 00:46
点赞 关注

回复
举报

78

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
能不能帮我看一下  急啊 再次谢谢
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
看你的第二个程序,要么是串口没有初始化(所以RI一直为零);要么数据是收到了的,要不不会返回0x00,而是在while处死掉。
    首先需要确认,串口上确实是收到数据了。
   把你的串口初始化和串口中断服务程序贴出来看一看。可能是波特率或者中断什么的设置不对。
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

4
 
#include
//************************定义函数**************************************
void serial_send(unsigned char send);
unsigned char serial_receive(void);
void timer_init(unsigned char time_num,unsigned char time_GATE,unsigned char time_CT,unsigned char time_mode);
void serial_init(unsigned char serial_scon,unsigned char serial_smod);

//******************************主函数*********************************
//描    述:实现单片机接收到电脑发送过来的数据之后把收到的数据发回给电脑
//*********************************************************************
int main(void)
{unsigned char i;
serial_init(0x51,0);//选择方式1,接受允许,波特率不加倍
timer_init(1,0,0,2);//T1,方式2
//设定波特率为9600b,Fosc=11.0592MHz ,TH1=0xfd,TL1=0xfd
TH1=0xfd;
TL1=0xfd;
TR1=1;//启动T1
RI=0;//清除接收完成位
serial_send('o');
serial_send('k');
while(1)
  {
   i=serial_receive();//调用接收子程序,接收数据
   serial_send(i);//把收到的数据发送出去
  }
}
void serial_init(unsigned char serial_scon,unsigned char serial_smod)
{
SCON=serial_scon;
PCON&=0x7f;//清SMOD
PCON|=(serial_smod<<8);
}
void timer_init(unsigned char time_num,unsigned char time_GATE,unsigned char time_CT,unsigned char time_mode)
{
if (time_num==0)
        {
         TMOD&=0xf0;
         TMOD|=(time_GATE<<4)+(time_CT<<3)+(time_mode);
        }
else if (time_num==1)
        {
         TMOD&=0x0f;
         TMOD|=(time_GATE<<8)+(time_CT<<7)+(time_mode<<4);
        }
}
unsigned char serial_receive(void)
{
while(RI==0);//等待接收数据
RI=0;//接收到数据,清除接收完毕标志
return(SBUF);//返回接收数据
}
void serial_send(unsigned char send)
{
while(TI!=0);//查询发送是否就绪
SBUF=send;//发送就绪,把要发送的数据发送出去
while(TI==0);//查询发送是否完毕
TI=0;//发送完毕,清除发送完成标志
}


 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

5
 
开串口中断啊,用中断方式多方便哈。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
有奖直播:当AI遇见仿真,会有什么样的电子行业革新之路?
首场直播:Simcenter AI 赋能电子行业研发创新
直播时间:04月15日14:00-14:50

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 4

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表