AdaFruit_NeopPixel with programmable light strand = missing Serial characters

Another thing to try is changing from the use of delay() in loop(). I believe that serialEvent() only gets called at the end of loop(). The delay() stops execution for the delay period, so my thinking is it reduces the opportunities for serialEvent() to be executed.

With the "blink without delay" approach, loop() becomes ...

void loop() {
    static unsigned long nextUpdate = millis();
    if (millis() > nextUpdate)
    {
        for (int i = lightcount; i >= 2 ; i--) {
            lane1.setPixelColor(i, lane1.getPixelColor(i - 1));
            lane1.setPixelColor(i - 1, 0);
            lane2.setPixelColor(i, lane2.getPixelColor(i - 1));
            lane2.setPixelColor(i - 1, 0);
            lane3.setPixelColor(i, lane3.getPixelColor(i - 1));
            lane3.setPixelColor(i - 1, 0);
        }
        lane1.show();
        lane2.show();
        lane3.show(); 
        nextUpdate += lightdelay;
    }
}