小羊同学 发表于 2015-4-13 21:02:35

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

为什么在中断里面用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);}
这个只有第一次拨动电机,监视器里面脉冲数才会有变化。

tsaiwn 发表于 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( ) 下面那行啦)

suoma 发表于 2015-4-14 09:00:34

tsaiwn 发表于 2015-4-13 22:55 static/image/common/back.gif
在中断程序内 "原则上" 不可以用 Serial.print
因为会来不及 !



谢谢分享学习一下
页: [1]
查看完整版本: 为什么在中断里面读取编码器脉冲数只能读取一小段,在loop里面显示就可以一直读取