[求助] ATmeg128a 串口问题

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

回复评论 (17)

//***********************************************************************
//   包含文件
//***********************************************************************

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;
}

  }
}
点赞  2013-9-10 17:35
我就问问为什么case’a'不起作用。我就奇了怪了。
点赞  2013-9-10 17:36
  没人理我。
点赞  2013-9-11 10:11
现在论坛怎么都是些吐槽贴,搞笑贴。提个问题都没人理了
点赞  2013-9-11 10:12
点赞  2013-9-11 12:45
简短说下就是我利用串口1的中断把usart1_rdata的值改为‘a'了。但是在主程序中为什么不执行判断usart1_rdata==‘a'中的语句呢?
我已经测试过了,usart1_rdata确实已经成’a'了啊。我就
点赞  2013-9-11 14:44
坛主莫怪哥在此放水,哥实在着急啊
点赞  2013-9-11 15:35
那个搞笑坛随便发个贴子回复量就能过10.
咱们这个学习坛问题讨论的帖子回复真是可怜。
点赞  2013-9-11 15:39
继续顶
点赞  2013-9-11 16:12
程序的问题,注意要将待发数据正确的写入串口0和串口1相应的寄存器,同时使能串口并正确的配置波特率发生器,做到这些就不会有问题。如果采用中断模式,还要注意中断使能和服务程序的编制。
上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
点赞  2013-9-11 17:04
引用: 原帖由 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;
}

后来我把这些判断语句放到中断函数里边就可以执行了。
我就是很奇怪。
点赞  2013-9-13 15:07
在主函数里不可以这么用判断,因为程序运行到这时未必就有数据进来,而且这样需要定义一个全局变量。
上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
点赞  2013-9-13 17:47
引用: 原帖由 chunyang 于 2013-9-13 17:47 发表
在主函数里不可以这么用判断,因为程序运行到这时未必就有数据进来,而且这样需要定义一个全局变量。

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

回复 14楼yangxf1217 的帖子

不要怀疑芯片,如果是芯片的问题,早就有人指出了,厂家也会作出相关声明或改进。还是找找自己的问题吧。
上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
点赞  2013-9-16 16:58
引用: 原帖由 chunyang 于 2013-9-16 16:58 发表
不要怀疑芯片,如果是芯片的问题,早就有人指出了,厂家也会作出相关声明或改进。还是找找自己的问题吧。

嗯,我再仔细研究研究,多谢您了。
点赞  2013-9-16 17:23

哥 我顶您

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

刚放假回来,有什么问题分享一下,呵呵。
点赞  2013-10-8 09:36
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复