极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11557|回复: 2

为什么在中断里面读取编码器脉冲数只能读取一小段,在loop里面显示就可以一直读取

[复制链接]
发表于 2015-4-13 21:02:35 | 显示全部楼层 |阅读模式
为什么在中断里面用Serial monitor读取编码器脉冲数只能读取一小段,在loop里面用Serial monitor 就可以一直读取
程序:
int state;
volatile unsigned int count=0;
void setup()
{Serial.begin(9600);
pinMode(2,INPUT);
attachInterrupt(0,then,CHANGE);}
void loop()
{Serial.println(count);
}
void then()
{count++;}
这个我拨动电机,监视器里脉冲数数据会改变。
int state;
volatile unsigned int count=0;
void setup()
{Serial.begin(9600);
pinMode(2,INPUT);
attachInterrupt(0,then,CHANGE);}
void loop()
{}
void then()
{count++;
Serial.println(count);}
这个只有第一次拨动电机,监视器里面脉冲数才会有变化。
回复

使用道具 举报

发表于 2015-4-13 22:55:37 | 显示全部楼层
在中断程序内 "原则上" 不可以用 Serial.print
因为会来不及 !

你可以先改 Serial.begin(115200); 看看
如果仍无法持续打印, 那就是来不及!
如果没问题, 那就用吧 !

说明:
    当你波特率 9600, 每秒钟只能印出大约 888 char (理论 960 char)
所以 1ms 只能印 不到 1 char
如果你的中段每 5 ms 来一次,
你在中断内用 Serial.print( )印 3 char 大概没问题
如果把波特率提高 Serial.begin(115200);
则每 1ms 可印大约 9 char
这时如果你的 Interrupt 每 1ms 来一次,
用 Serial.print 应该还可以 !
由于 Serial.print 要靠另一个中断来帮忙把字符串真的送出,
当中断被禁止(在 中断程序内, 中断自断禁止!)
但当 Interrupt 来太快,
因为 Serial.print 来不及打印就会回不来
(就是不会执行 Serial.print( ) 下面那行啦)
回复 支持 反对

使用道具 举报

发表于 2015-4-14 09:00:34 | 显示全部楼层
tsaiwn 发表于 2015-4-13 22:55
在中断程序内 "原则上" 不可以用 Serial.print
因为会来不及 !

谢谢分享学习一下
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-8 01:30 , Processed in 0.065401 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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