3894|13

60

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

单片机串口接收求助 [复制链接]

void serial_send(void)
{
        char i;
       
        for(i=0; i < 4; i++)
        {
                temp = kaiguan_data;
                SBUF0 = temp;
               
        while(!TI0);
                TI0=0;
         }

}
void UART0_ISR(void) interrupt 4//接收子程序
{
  char i;
  for (i=0;i<4;i++)
   { if(!TI0)
         {
                  RI0=0;
          temp=SBUF0 ;
          kaiguan_data=SBUF0 ;
                 
              TI0=0;
          }
   }
  ReceiveBit=1;
  //TI0=0;

以上是我的发射接收程序
我发射1234
接收到得是00 12 12 12
是怎么回事
我怎么修改那

最新回复

  不东,学习。。。。。。。。  详情 回复 发表于 2009-9-1 10:04
点赞 关注

回复
举报

94

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
有仿真图没?
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
波特率设置得不对
TI0=0; 这句多余
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

4
 
void UART0_ISR(void) interrupt 4//接收子程序
{
? char i;
? for (i=0;i <4;i++)
? { if(!TI0)
? ? ? ? {
? RI0=0;
? ? ? ? ? temp=SBUF0 ;
? ? ? ? ? kaiguan_data=SBUF0 ;

? ? ? TI0=0;
? ? ? ? ? }
? }
? ReceiveBit=1;
? //TI0=0;

以上是我的发射接收程序
我发射1234
接收到得是00 12 12 12
是怎么回事
我怎么修改那
[/quote]

这样不行,串口没接收完一个字符就中断一次,这样接收多个字符是不行的。
不要使用for循环。可以试试下面的思路:
if(ISR)
{
   RxBuffer[PutIndex++] = SBUF0;
}



 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 3 楼 zyzhang365 的回复:
void UART0_ISR(void) interrupt 4//接收子程序
{
? char i;
? for (i=0;i <4;i++)
? { if(!TI0)
? ? ? ? {
? RI0=0;
? ? ? ? ? temp=SBUF0 ;
? ? ? ? ? kaiguan_data=SBUF0 ;

? ? ? TI0=0;
? ? ? ? ? }
? }
? ReceiveBit=1;
? //TI0=0;

以上是我的发射接收程序
我发射1234
接收到得是00 12 12 12
是怎么回事
我怎么修改那
[/quote]

这样不行,串口没接收完一个字符就中断一次,这样接收多个字符是不行的。
不要使用for循环。可以试试下面的思路:
if(ISR)
{
? RxBuffer[PutIndex++] = SBUF0;
}




你好
谢谢你的意见
具体对照我上面的程序应该怎样修改那
我刚入门不太懂谢谢了
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 1 楼 shishangyangyang 的回复:
有仿真图没?


这个没有仿真图
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 2 楼 guetcw 的回复:
波特率设置得不对
TI0=0; 这句多余

波特率设置的没有问题
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

8
 
void UART0_ISR(void) interrupt 4//接收子程序,不要用中断即去interrupt 4
发送完以后,直接调用接收子程序(你是轮讯)
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(中级)

9
 
[/quote]
你好
谢谢你的意见
具体对照我上面的程序应该怎样修改那
我刚入门不太懂谢谢了
[/quote]

static unsigned char RxPuIndex;
static unsigned char RxBuffer[4];

void UART0_ISR(void) interrupt 4//接收子程序
{
    if(RI0)
    {     
          RI0=0; // clear interrupt flag

          if(RxPuIndex < 4)
          {            
             RxBuffer[RxPuIndex++]=SBUF0 ;
          }
    }
  }

基本思路就是这样,自己改改逻辑吧。
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

10
 

static unsigned char RxPuIndex;
static unsigned char RxBuffer[4];

void UART0_ISR(void) interrupt 4//接收子程序
{
? ? if(RI0)
? ? {? ?
? ? ? ? ? RI0=0; // clear interrupt flag

? ? ? ? ? if(RxPuIndex < 4)
? ? ? ? ? {? ? ? ? ? ?
? ? ? ? ? ? RxBuffer[RxPuIndex++]=SBUF0 ;
? ? ? ? ? }
? ? }
? }

基本思路就是这样,自己改改逻辑吧。
[/quote]
我试了,还是没有 出来呀
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

11
 
RxBuffer[RxPuIndex++]=SBUF0 ;
RxPuIndex %= BUFFERLENGTH;// 缓冲长度,防止溢出
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

12
 
引用 10 楼 schlafenhamster 的回复:
RxBuffer[RxPuIndex++]=SBUF0 ;
RxPuIndex %= BUFFERLENGTH;// 缓冲长度,防止溢出


楼上能具体点吗?
具体我的程序怎么修改啊?
谢谢了
 
 
 

回复

94

帖子

0

TA的资源

一粒金砂(初级)

13
 
楼主,估计你串口没有初始化或者初始化不正确。
如果方便,可以把相关的代码都贴出来吧。
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

14
 
  不东,学习。。。。。。。。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

北京市海淀区中关村大街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
快速回复 返回顶部 返回列表