Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Serial port arduino串行不稳定行为缺少字符,有时整个传输也会丢失_Serial Port_Arduino_Arduino Uno - Fatal编程技术网

Serial port arduino串行不稳定行为缺少字符,有时整个传输也会丢失

Serial port arduino串行不稳定行为缺少字符,有时整个传输也会丢失,serial-port,arduino,arduino-uno,Serial Port,Arduino,Arduino Uno,我对UNO上的硬件串行有问题,在许多情况下,它似乎丢失了一个字符(通常是接收到的第一个字符),在某些情况下,它会丢失整个传输。只有当Arduino从我在串行监视器中键入的计算机接收数据时,才会发生这种情况。当我发送字符串时,我可以看到RX灯闪烁,但arduino完全忽略了它 我发送的数据是三个逗号分隔的8位无符号整数 #include <Adafruit_NeoPixel.h> //#include <OneSheeld.h> #define PIN 6 #define

我对UNO上的硬件串行有问题,在许多情况下,它似乎丢失了一个字符(通常是接收到的第一个字符),在某些情况下,它会丢失整个传输。只有当Arduino从我在串行监视器中键入的计算机接收数据时,才会发生这种情况。当我发送字符串时,我可以看到RX灯闪烁,但arduino完全忽略了它

我发送的数据是三个逗号分隔的8位无符号整数

#include <Adafruit_NeoPixel.h>
//#include <OneSheeld.h>

#define PIN 6
#define LEDS 5

Adafruit_NeoPixel strip = Adafruit_NeoPixel(LEDS, PIN, NEO_GRB + NEO_KHZ800);
int leds = LEDS-1;
byte red;
byte green;
byte blue;
int i;
// pins for the LEDs:
//const int red = 3;
//const int green = 5;
//const int blue = 6;

void setup() {
  // initialize serial:
  Serial.begin(9600);
  strip.begin();
  strip.setPixelColor(0,12,12,12);
     strip.show(); // Initialize all pixels to 'off'
     Serial.print("number of LEDS in strip:");
     Serial.println(LEDS);
     i=0;
  // make the pins outputs:
//  pinMode(redPin, OUTPUT); 
//  pinMode(greenPin, OUTPUT); 
//  pinMode(bluePin, OUTPUT); 

}

void loop() {
  red = 0;
  green=0;
  blue= 0;

 // i=0;
  // if there's any serial available, read it:
  while (Serial.available() > 0) {

    // look for the next valid integer in the incoming serial stream:
      red = Serial.parseInt(); 
    // do it again:
      green = Serial.parseInt(); 
    // do it again:
       blue = Serial.parseInt();
       delay(1);

    // look for the newline. That's the end of your
    // sentence:
    if (Serial.read() == '\n') {
      // constrain the values to 0 - 255 and invert
      // if you're using a common-cathode LED, just use "constrain(color, 0, 255);"
//      red = constrain(red, 0, 255);
//      green = constrain(green, 0, 255);
//      blue = constrain(blue, 0, 255);     
         Serial.print("LED being served = ");
         Serial.println(i);


      // fade the red, green, and blue legs of the LED: 

//      analogWrite(redPin, red);
//      analogWrite(greenPin, green);
//      analogWrite(bluePin, blue);
      strip.setPixelColor(i,red,green,blue);
      strip.show();

      // print the three numbers in one string as hexadecimal:
      Serial.print("R=");
      Serial.println(red);
      Serial.print("G=");
      Serial.println(green);
      Serial.print("B=");
      Serial.println(blue);

     if(i==leds)
     i=0;
     else
     i=i+1;
    }
  }
}
#包括
//#包括
#定义引脚6
#定义LED 5
Adafruit_Neopix条=Adafruit_Neopix条(LED、引脚、NEO_GRB+NEO_KHZ800);
int LED=LED-1;
字节红色;
字节绿色;
字节蓝色;
int i;
//LED的引脚:
//常数int red=3;
//常数int绿色=5;
//常数int蓝色=6;
无效设置(){
//初始化序列号:
Serial.begin(9600);
strip.begin();
strip.setPixelColor(0,12,12,12);
strip.show();//将所有像素初始化为“关闭”
串行打印(“条带中的LED数量:”);
串行打印LN(LED);
i=0;
//使引脚输出:
//引脚模式(红色引脚,输出);
//引脚模式(绿色引脚,输出);
//引脚模式(蓝引脚,输出);
}
void循环(){
红色=0;
绿色=0;
蓝色=0;
//i=0;
//如果有可用的序列号,请阅读:
while(Serial.available()>0){
//在传入串行流中查找下一个有效整数:
红色=Serial.parseInt();
//再做一次:
绿色=Serial.parseInt();
//再做一次:
blue=Serial.parseInt();
延迟(1);
//寻找新线,这是你人生的终点
//句子:
如果(Serial.read()='\n'){
//将值约束为0-255并反转
//如果您使用的是普通阴极LED,只需使用“约束(颜色,0255);”
//红色=约束(红色,0,255);
//绿色=约束(绿色,0,255);
//蓝色=约束(蓝色,0,255);
Serial.print(“正在服务的LED=”);
序列号println(i);
//使LED的红色、绿色和蓝色支脚褪色:
//模拟写入(红色,红色);
//模拟写入(绿色,绿色);
//模拟写入(蓝针,蓝色);
strip.setPixelColor(i、红色、绿色、蓝色);
strip.show();
//将三个数字打印为十六进制:
Serial.print(“R=”);
序列号。打印号(红色);
Serial.print(“G=”);
Serial.println(绿色);
Serial.print(“B=”);
Serial.println(蓝色);
如果(i==LED)
i=0;
其他的
i=i+1;
}
}
}
下面是输入以下字符串时从串行监视器输出的一些示例 字符串:

输出:

number of LEDS in strip:5
LED being served = 0
R=25
G=25
B=25
LED being served = 1   <<< this transmission got lost the first time it was sent
R=25
G=25
B=25
LED being served = 2
R=25
G=25
B=25
LED being served = 3
R=5
G=25
B=25
LED being served = 4 <<< This transmission got lost the first 4 times it was sent
R=5
G=25
B=25
LED being served = 0
R=25
G=25
B=25
LED being served = 1
R=25
G=25
B=25
LED being served = 2
R=25
G=25
B=25
LED being served = 3
R=25
G=25
B=25
LED being served = 4
R=5
G=25
B=25
LED being served = 0
R=25
G=25
B=25
LED being served = 1
R=5
G=25
B=25
LED being served = 2
R=25
G=25
B=25
LED being served = 3
R=25
G=25
B=25
LED being served = 4
R=25
G=25
B=25
条带中的LED数量:5
正在服务的LED=0
R=25
G=25
B=25

LED被服务=1您的问题很可能是时间问题:

while (Serial.available() > 0) {
  red = Serial.parseInt(); 
  green = Serial.parseInt(); 
  blue = Serial.parseInt();
请注意,当您第一次进入这个while循环时,您只收到了来自串行线的第一个字节。第二个字节甚至可能还不在线路上。如果您已将“25,25,25”发送给Arduino,并且它只有第一个字符,
red=Serial.parseInt()
将返回2并将其分配给red
green=Serial.parseInt()
将获得5,而
blue=Serial.parseInt()
将获得25。然后,串行缓冲区中会出现“、25”,这可能会在下一个直通循环()中导致更多问题

parseInt()上的文档说,它将等待一个有效的整数字节长达一秒钟,但它没有说明一旦有了一个有效的整数字节,它将做什么,它是否将等待1/Hz秒,看看是否还有更多的整数字节。如果是这样,那么你必须看看潜在的硬件原因

你必须记住串行协议不是一个可靠的协议。在将每个字节传递到应用程序之前,都会检查其奇偶校验,如果奇偶校验失败,则可能根本不会传递

我以前和Arduino有过类似的问题。它所需要的只是一些杂散的射频,你的实验板上的噪音,或者其他任何数量的电气问题,当你去读串行线时,0变成1,反之亦然。鉴于丢失发生在系列中的第一个字节上,我强烈怀疑您看到了这种现象。如果您的串行引脚上有缓慢的电压积累,当您读取它时,您首先会看到的是1。我当前的项目通过交替将顶部位设置为0和1来识别高字节和低字节。偶尔,我会得到三个带0前缀的字节或三个带1前缀的字节,然后我就扔掉了这些样本


您的UNO是否位于电绝缘表面上?如果你使用的是实验板,你对它有多信任?你们确定你们在连接线上的电阻接近于零,它们之间的电阻接近于无穷大吗?你有一个蹩脚的USB电缆处理你的串行通道吗?如果是这样,附近的强射频信号可能会导致您的问题。

谢谢您的回答,我的代码普遍认为使用parseint()是一个坏主意,因此我采取了避免措施。我不认为这是一个射频问题,在这种情况下,因为我使用的是一个良好的质量usb电缆,从来没有遇到过问题,它或与串行通过它。这肯定与parseInt()如何处理数据有关。有趣的是,我从一个官方的Arduino示例中复制了这种读取数据的方法,该示例做了完全相同的事情(从串行读取3个逗号分隔的RGB值),如果您确定这是一个数据可用性问题,那么读取整数就变成了一个简单的循环:将累加器设置为零,只要串行输入中有一个从“0”到“9”的新值,将累加器乘以10并添加新输入。当您从串行获得非零到九的值时,返回累加器。(错误条件留给读者作为练习。=])请注意,当strip.show()运行时,传入的数据将被丢弃。