2

我一直在研究传感器读取器/齿轮遥控汽车机器人,但我卡在了一些东西上。我介绍了一个 void loop() 和一个 void serialEvent() 范围。serialEvent 获取值、累加并调用其他函数,例如 turnRight()、turnLeft() 或 reverseGear()。但是今天我尝试为汽车做一个速度显示。但是我发现串行事件中断了连续显示的动画。换句话说,我想在 serialEvent 上连续接收数据,同时在 void 循环上成功完成其他连续事件。我附上了我认为可能是问题的代码部分。我使用 Arduino Mega 1280。任何答案将不胜感激。谢谢。

注意:请注意,serialEvent 应连续接收数据(有 1 秒延迟),用于调整灵敏度的电机。

串行事件就像..

void serialEvent(){
  if ( Serial.available() > 0 ){ 
      int val = Serial.read() - '0'; 
      if(val == 0){ .......................

循环范围就像..

void loop() 
{ 
  displayModule.setDisplayToDecNumber(15, 0, false);
  for(int k =0; k<=7; k++){
    displayModule.setLED(TM1638_COLOR_GREEN, k);
    delay(100);
    ............................
4

3 回答 3

3

Arduino 论坛的座右铭始终适用:如果您发布整个草图,而不仅仅是您认为问题所在的片段,则更容易提供帮助。

也就是说,我认为这里有一个严重的问题:

for(int k =0; k<=7; k++){
    displayModule.setLED(TM1638_COLOR_GREEN, k);
    delay(100);

这个 for 循环基本上会暂停你的草图至少 800 毫秒。

如果你想让你的草图成为“多任务”,你必须停止使用延迟(),并将你的思维方式从顺序编程转换为基于状态(或事件)的编程。通常的建议是研究“立即闪烁”示例。

第二个说明,我不明白你的意思

我介绍了一个 void loop()

如果您不编写循环函数,则草图将不会首先编译。

于 2013-03-19T13:05:40.623 回答
1

我不知道这是否会有所帮助。这是我制作的一个串行代码示例,它根据传入的串行数据绘制 2 个条形图。这是一个处理文件,但它应该类似于 Arduino 草图。至少在serialEvent 的意义上。如果您之前没有使用过处理,则 draw 方法类似于循环方法。也许这段代码中有一些东西可以帮助你。

import processing.serial.*;

Serial myPort;
float[] floatArray;
float f1; float f2;

void setup() {
  size(400, 400);
  // Prints lists of serial ports
  println(Serial.list());
  // Usually arduino is port [0], but if not then change it here
  myPort = new Serial(this, Serial.list()[0], 9600);
  // Don't call serialEvent until new line character received
  myPort.bufferUntil('\n');
  // Creates and array of floating decimal numbers and initializes its length to 2
  floatArray = new float[2];
}

void draw() {
  // Draws 2 bars to represent incoming data in patriotic fashion
  background(0, 0, 255);
  fill(255, 0, 0);
  rect(0, f1, 100, height);
  fill(255);
  rect(100, f2, 100, height); 
}

void serialEvent(Serial myPort) {
  // Reads input until it receives a new line character
  String inString = myPort.readStringUntil('\n');
  if (inString != null) {
    // Removes whitespace before and after string
    inString = trim(inString);
    // Parses the data on spaces, converts to floats, and puts each number into the array
    floatArray = float(split(inString, " "));
    // Make sure the array is at least 2 strings long.   
    if (floatArray.length >= 2) {
      // Assign the two numbers to variables so they can be drawn
      f1 = floatArray[0];
      f2 = floatArray[1];
      println(f2);
      // You could do the drawing down here in the serialEvent, but it would be choppy
    }
  } 
}
于 2013-02-21T21:18:18.253 回答
0

我相信您需要设置串行接收中断来实现您的目标。

我会在以下位置使用 Peter Fluery 的 AVR 串行库:

http://homepage.hispeed.ch/peterfleury/avr-software.html

它使用循环环形缓冲区实现串行中断。

于 2013-03-06T16:18:57.813 回答