极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 24974|回复: 10

串口中断函数问题

[复制链接]
发表于 2013-5-4 21:18:40 | 显示全部楼层 |阅读模式
在使用atmel 328p芯片的时候,也就是atduino uno 开发板的时候,想做一个串口接收中断的程序,但是看了很多的帖子,和调试了几个程序,都只能够做到串口的接收和发送程序,但是串口的中断程序没有做成功,请问 atmel 328p 有串口接收中断的功能的吗,像51单片机那样的串口中断功能???新人一个,先在此谢过了!!!
回复

使用道具 举报

发表于 2013-5-4 22:54:23 | 显示全部楼层
当串口有数据时,若存在serialEvent()中断方法则会被调用,调用后需要通过Serial.read()读取所有字符后此中断才能被解除,不然会一直此于中断状态。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-5 20:20:58 | 显示全部楼层
谢谢,帮了我一个大忙。非常感谢!!!
回复 支持 反对

使用道具 举报

发表于 2013-5-5 21:45:19 | 显示全部楼层
serialEvent()是一个伪事件,和中断没有任何关系
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-7 15:48:29 | 显示全部楼层
奈何col 发表于 2013-5-5 21:45
serialEvent()是一个伪事件,和中断没有任何关系

这是什么意思的呢,能够举个具体的例子说明下的吗,我是新手的恩……
回复 支持 反对

使用道具 举报

发表于 2013-5-7 21:01:57 | 显示全部楼层
cai_xiao_xiang 发表于 2013-5-7 15:48
这是什么意思的呢,能够举个具体的例子说明下的吗,我是新手的恩……

就是说这个函数和中断没有关系,2楼搞错了..
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-8 00:02:13 | 显示全部楼层
奈何col 发表于 2013-5-7 21:01
就是说这个函数和中断没有关系,2楼搞错了..

String comdata ="";
int  mark = 0;
void setup()
{
  
   pinMode(13, OUTPUT);
  Serial.begin(38400);
}

void loop()
{
    digitalWrite(13,0);
    delay(1000);
// int j = 0;
  // while (Serial.available() > 0)
  // {
  //   comdata += char(Serial.read());//读取串口数据
  //   delay(2);
  //   mark = 1;
  // }

  // if(mark == 1)
  // {
  //   Serial.println(comdata);
  //   Serial.println(comdata.length());//输出数据的长度

  //   comdata = String("");
  //   mark = 0;
// }
}
void serialEvent()//串口中断函数
{
  while (Serial.available())
  {
    char inChar=Serial.read();
    Serial.println(inChar);
    Serial.println(comdata.length());//输出数据的长度
    for(int a=4;a>0;a--)
   { digitalWrite(13,1);
    delay(2000);
    digitalWrite(13,0);
    delay(2000);
    }
  }
}
我写的这个程序,烧到板子上面去了,正常是13脚灯灭的,我用串口发生数据,那个灯就会闪烁亮的,请问这个怎么说的呢?我都糊涂了呢???
回复 支持 反对

使用道具 举报

发表于 2013-11-20 15:49:57 | 显示全部楼层
SerialEvent occurs whenever a new data comes in the hardware serial RX.  This routine is run between each time loop() runs, so using delay inside loop can delay response.  Multiple bytes of data may be available.
这是官方文档里似例代码的注释,讲的很清楚。SerialEvent()这个函数会在loop()函数执行完后被自动调用,不是通过中断的方式调用的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-22 12:24:52 | 显示全部楼层
有一点理解,用的时候还是不知道怎么用的。
回复 支持 反对

使用道具 举报

发表于 2014-11-1 00:04:37 | 显示全部楼层
这样行不行呢?

void loop()
{
  if(Serial.available()>0)
  {
     serial.print();
     digital.write(Int_0 ,low);
     digital.write(Int_0 ,high);    //在串口操作中触发、并产生外部中断。
   }   


主要意图就是先使能外部中断0之后,在主程序中通过串口接收过程、用软件操作Int_0 管脚,达到外部中断触发条件后,用外部中断闪烁LED来显示串口动作。近似产生串口中断。

求评论!!!!!!!!!!!
回复 支持 反对

使用道具 举报

发表于 2015-11-18 09:21:24 | 显示全部楼层
楼主问题解决了吗,求分享
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-16 23:22 , Processed in 0.040094 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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