我使用来自Adafruit_NeoPixel的NeoPixel,我有问题与我的板串行通信,但它是好的,当我不使用pixels.show();我不知道为什么,但任何人都可以解释这一点,以及如何解决这个问题。(我也必须刷新引导加班)*对不起我的英语。
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
#define PIN 6
#define NUMPIXELS 16
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
int delayval = 500;
void setup() {
#if defined (__AVR_ATtiny85__)
if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
#endif
pixels.begin();
Serial.begin(115200);
}
void loop() {
for(int i=0;i<NUMPIXELS;i++){
pixels.setPixelColor(i, pixels.Color(0,150,0));
pixels.show();
}
}
void serialEvent() {
if(Serial.available()){
delay(5);
size_t len = Serial.available();
char rcvData[128];
Serial.readBytes( rcvData, len );
rcvData[len] = '\0';
Serial.write(rcvData);
Serial.write('\n');
}
}串行输入
123456789
123456789
123456789
123456789
123456789
123456789
123456789
123456789
123456789
abcdefghijklmnopqrs
abcdefghijklmnopqrs
abcdefghijklmnopqrs
abcdefghijklmnopqrs
abcdefghijklmnopqrs
abcdefghijklmnopqrs
abcdefghijklmnopqrs串行输出
12679
12349
123459
12456789
12569
126789
12389
12389
12389
abdefklqrs
abfghijklmnopqrs
abghmnos
abcdijkpqs
abfglmns
abcdijopqs
abefglmnrs发布于 2016-02-24 09:07:15
嗯,如果你读了新像素::显示部分,那是因为关键的时机。
注意:数据锁存器=输出流中的50+微秒暂停。而不是在函数结束时延迟,而是注意到结束时间,如果需要的话,函数只会在发出下一轮数据时延迟(如果需要的话),直到锁存时间过去。这允许主线代码开始生成下一帧数据,而不是延迟锁存。 while(!canShow()); endTime是一个私有成员(而不是全局var),因此 不同引脚上的实例可以快速依次发出(每个实例不会延迟下一个实例)。为了使此代码运行时-可配置为与任何引脚一起工作,SBI/CBI指令被避免,而是通过OUT或ST指令支持完整端口写入。它依赖于两个事实:外围功能(如PWM)优先于输出引脚,因此我们的端口范围的写操作不会产生干扰,并且在向LED发出数据时,中断会被全局禁用,因此不会有其他代码访问端口。该代码获取端口状态的初始“快照”,计算'pin high‘和'pin low’值,并根据需要将这些值写回端口寄存器。 noInterrupts();需要100%关注指令定时
希望这能回答你的问题
https://stackoverflow.com/questions/35596005
复制相似问题