我使用来自https://github.com/adafruit/Adafruit_NeoPixel的Adafruit_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
答案 0 :(得分:3)
好吧,如果你读了{{3}}部分,那是因为关键的时机。
注意:数据锁存器=输出流中的50+微秒暂停。而不是 在函数结束时加一个延迟,结束时间被注明 该函数将在发出时暂停(如果需要) 后续轮数据直到锁存时间结束。这个 允许主线代码开始生成下一帧数据 而不是停止闩锁。
<强>而(泳庆()!); 强> endTime是一个私有成员(而不是全局变量),因此mutliple
不同引脚上的实例可以连续快速发布(每个 实例不会延迟下一个)。 为了使此代码可运行时配置为可以与任何引脚一起使用, SBI / CBI指令被避免支持通过的完整PORT写入 OUT或ST指令。它依赖于两个事实:外围 功能(如PWM)优先于输出引脚,所以我们的PORT- 宽写入不会干扰,并且全局禁用中断 当数据发布到LED时,所以没有其他代码 访问PORT。该代码获取了PORT的初始“快照” state,计算'pin high'和'pin low'值,然后将它们写回来 根据需要到PORT注册。noInterrupts(); 需要100%专注于指令时间
希望这回答你的问题