5584|17

900

帖子

0

TA的资源

五彩晶圆(初级)

楼主
 

ATmeg128a 串口问题 [复制链接]

各位大侠,我的串口很奇怪,我先给串口0输入一串字符,然后给串口1输入字符‘a';串口1会先输出一个‘a',然后就没有输出我想要的数组里的数,反而一直输出’y'。我很气愤,特发此贴。

最新回复

我也正在学串口   遇到问题还没解决  详情 回复 发表于 2013-10-2 12:29
点赞 关注
 

回复
举报

900

帖子

0

TA的资源

五彩晶圆(初级)

沙发
 
//***********************************************************************
//   包含文件
//***********************************************************************

int   fbcount=0x00,flag1=0x00,flag2=0x00,i=0x00;

char fbdata[20];

char usart1_rdata;                                 
char usart_ct_data='a';
char usart_fb_data=0;

void usart0_init()
{
  UCSR0A=0x00;                                 //单倍速模式
  UCSR0B=0x98;                                 //接收中断允许                              
  UCSR0C=(1<   UBRR0H=baud_h;                               //写波特率的值
  UBRR0L=baud_l;
}

void usart1_init()
{
  UCSR1A=0x00;                                 //单倍速模式
  UCSR1B=0x98;                                 //接收中断允许                              
  UCSR1C=(1<   UBRR1H=baud_h;                               //写波特率的值
  UBRR1L=baud_l;
}





//*************************************************************************
//  串口0相关中断服务子程序
//*************************************************************************

//数据发送结束中断向量
SIGNAL(SIG_USART0_TRANS)             //中断服务程序
{
   delay_ms(1);                   //相关操作
}

SIGNAL(SIG_USART0_RECV)            //中断服务程序
{
     usart_fb_data=UDR0;           //将接收到的数据取出
fbdata[fbcount]=usart_fb_data;
fbcount++;
}


//*************************************************************************
//  串口1相关中断服务子程序
//*************************************************************************


//数据发送结束中断向量
SIGNAL(SIG_USART1_TRANS)             //中断服务程序
{
   delay_ms(1);                   //相关操作
}

SIGNAL(SIG_USART1_RECV)            //中断服务程序
{
    usart1_rdata=UDR1;           //将接收到的数据取出
    UDR1=usart1_rdata;
}


//*************************************************************************
//   主程序
//*************************************************************************
void main()
{
  usart0_init();                             //usart0串口初始化
  usart1_init();                              //usart1串口初始化配置

  SREG|=0x80;                                //开启全局中断

  while(1)
  {

  switch(usart1_rdata)
  {

     case 'a': UDR1=fbdata[0];break;
     default: UDR1='y';break;
}

  }
}
 
 
 

回复

900

帖子

0

TA的资源

五彩晶圆(初级)

板凳
 
我就问问为什么case’a'不起作用。我就奇了怪了。
 
 
 

回复

900

帖子

0

TA的资源

五彩晶圆(初级)

4
 
  没人理我。
 
 
 

回复

900

帖子

0

TA的资源

五彩晶圆(初级)

5
 
现在论坛怎么都是些吐槽贴,搞笑贴。提个问题都没人理了
 
 
 

回复

900

帖子

0

TA的资源

五彩晶圆(初级)

6
 
 
 
 

回复

900

帖子

0

TA的资源

五彩晶圆(初级)

7
 
简短说下就是我利用串口1的中断把usart1_rdata的值改为‘a'了。但是在主程序中为什么不执行判断usart1_rdata==‘a'中的语句呢?
我已经测试过了,usart1_rdata确实已经成’a'了啊。我就
 
 
 

回复

900

帖子

0

TA的资源

五彩晶圆(初级)

8
 
坛主莫怪哥在此放水,哥实在着急啊
 
 
 

回复

900

帖子

0

TA的资源

五彩晶圆(初级)

9
 
那个搞笑坛随便发个贴子回复量就能过10.
咱们这个学习坛问题讨论的帖子回复真是可怜。
 
 
 

回复

900

帖子

0

TA的资源

五彩晶圆(初级)

10
 
继续顶
 
 
 

回复

1万

帖子

142

TA的资源

版主

11
 
程序的问题,注意要将待发数据正确的写入串口0和串口1相应的寄存器,同时使能串口并正确的配置波特率发生器,做到这些就不会有问题。如果采用中断模式,还要注意中断使能和服务程序的编制。

点评

中断我测试过了,没有问题。我在串口0中断里 写上: usart1_rdata=UDR1; //将接收到的数据取出 UDR1=usart1_rdata; //输出接收到的数据 我输入‘a\'是可以输出’a\'的。 就是后来  详情 回复 发表于 2013-9-13 15:07
 
个人签名上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
 
 

回复

900

帖子

0

TA的资源

五彩晶圆(初级)

12
 
原帖由 chunyang 于 2013-9-11 17:04 发表
程序的问题,注意要将待发数据正确的写入串口0和串口1相应的寄存器,同时使能串口并正确的配置波特率发生器,做到这些就不会有问题。如果采用中断模式,还要注意中断使能和服务程序的编制。

中断我测试过了,没有问题。我在串口0中断里 写上:
   usart1_rdata=UDR1;           //将接收到的数据取出
    UDR1=usart1_rdata;       //输出接收到的数据
我输入‘a'是可以输出’a'的。


就是后来加上了主函数里的判断语句后,就是不执行判断为‘a'后的语句。

  switch(usart1_rdata)
  {
     case 'a': UDR1=fbdata[0];break;
     default: UDR1='y';break;
}

后来我把这些判断语句放到中断函数里边就可以执行了。
我就是很奇怪。
 
 
 

回复

1万

帖子

142

TA的资源

版主

13
 
在主函数里不可以这么用判断,因为程序运行到这时未必就有数据进来,而且这样需要定义一个全局变量。

点评

usart1_rdata我定义的是一个全局变量;程序是循环进行的,我中断一次把usart1_rdata改成‘a\'以后应该就能进入判断语句才对。可就是进不去。是不是aymeg128这个芯片的问题。  详情 回复 发表于 2013-9-16 09:18
 
个人签名上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
 
 

回复

900

帖子

0

TA的资源

五彩晶圆(初级)

14
 
原帖由 chunyang 于 2013-9-13 17:47 发表
在主函数里不可以这么用判断,因为程序运行到这时未必就有数据进来,而且这样需要定义一个全局变量。

usart1_rdata我定义的是一个全局变量;程序是循环进行的,我中断一次把usart1_rdata改成‘a'以后应该就能进入判断语句才对。可就是进不去。是不是aymeg128这个芯片的问题。

点评

不要怀疑芯片,如果是芯片的问题,早就有人指出了,厂家也会作出相关声明或改进。还是找找自己的问题吧。  详情 回复 发表于 2013-9-16 16:58
 
 
 

回复

1万

帖子

142

TA的资源

版主

15
 

回复 14楼yangxf1217 的帖子

不要怀疑芯片,如果是芯片的问题,早就有人指出了,厂家也会作出相关声明或改进。还是找找自己的问题吧。

点评

嗯,我再仔细研究研究,多谢您了。  详情 回复 发表于 2013-9-16 17:23
 
个人签名上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
 
 

回复

900

帖子

0

TA的资源

五彩晶圆(初级)

16
 
原帖由 chunyang 于 2013-9-16 16:58 发表
不要怀疑芯片,如果是芯片的问题,早就有人指出了,厂家也会作出相关声明或改进。还是找找自己的问题吧。

嗯,我再仔细研究研究,多谢您了。
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

17
 

哥 我顶您

我也正在学串口   遇到问题还没解决

点评

刚放假回来,有什么问题分享一下,呵呵。  详情 回复 发表于 2013-10-8 09:36
 
 
 

回复

900

帖子

0

TA的资源

五彩晶圆(初级)

18
 
原帖由 zhengwbang 于 2013-10-2 12:29 发表
我也正在学串口   遇到问题还没解决

刚放假回来,有什么问题分享一下,呵呵。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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