社区导航

 

搜索
查看: 2800|回复: 13

单片机串口接收求助

[复制链接]

92

TA的帖子

0

TA的资源

禁止发言

发表于 2009-8-28 12:49 | 显示全部楼层 |阅读模式
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
是怎么回事
我怎么修改那

133

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-8-28 15:43 | 显示全部楼层
有仿真图没?

回复

使用道具 举报

103

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-8-28 15:59 | 显示全部楼层
波特率设置得不对
TI0=0; 这句多余

回复

使用道具 举报

107

TA的帖子

0

TA的资源

禁止发言

发表于 2009-8-28 16:32 | 显示全部楼层
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;
}




回复

使用道具 举报

111

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-8-28 17:48 | 显示全部楼层
引用 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
是怎么回事
我怎么修改那


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



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

回复

使用道具 举报

106

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-8-28 17:52 | 显示全部楼层
引用 1 楼 shishangyangyang 的回复:
有仿真图没?

这个没有仿真图

回复

使用道具 举报

107

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-8-28 17:53 | 显示全部楼层
引用 2 楼 guetcw 的回复:
波特率设置得不对
TI0=0; 这句多余

波特率设置的没有问题

回复

使用道具 举报

109

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-8-28 18:51 | 显示全部楼层
void UART0_ISR(void) interrupt 4//接收子程序,不要用中断即去interrupt 4
发送完以后,直接调用接收子程序(你是轮讯)

回复

使用道具 举报

104

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2009-8-28 18:53 | 显示全部楼层
[/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 ;
          }
    }
  }

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

回复

使用道具 举报

104

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-8-29 15:26 | 显示全部楼层

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]
我试了,还是没有 出来呀

回复

使用道具 举报

108

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-8-29 16:59 | 显示全部楼层
RxBuffer[RxPuIndex++]=SBUF0 ;
RxPuIndex %= BUFFERLENGTH;// 缓冲长度,防止溢出

回复

使用道具 举报

110

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-8-31 13:55 | 显示全部楼层
引用 10 楼 schlafenhamster 的回复:
RxBuffer[RxPuIndex++]=SBUF0 ;
RxPuIndex %= BUFFERLENGTH;// 缓冲长度,防止溢出

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

回复

使用道具 举报

139

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-8-31 15:34 | 显示全部楼层
楼主,估计你串口没有初始化或者初始化不正确。
如果方便,可以把相关的代码都贴出来吧。

回复

使用道具 举报

99

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-9-1 10:04 | 显示全部楼层
  不东,学习。。。。。。。。

回复

使用道具 举报

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

关闭

站长推荐上一条 /5 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-1-20 05:46 , Processed in 0.411211 second(s), 17 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表