Arduino Uno - неверные / зашифрованные последовательные данные

Я изо всех сил пытался написать очень простую программу Arduino, которая увеличивает контакты адреса в EPROM, а затем считывает данные через другие контакты. Когда мне не удалось сделать что-то столь же простое, как приращение массива логических значений (MSB для обоих значений также почти всегда застревает на 1), я предполагал, что мой код должен быть испорчен, но затем он начал отправлять дважды как столько символов, сколько должно (Serial.println(char);), чего не было при отправке строк. Затем начали происходить еще худшие вещи, например, устройство полностью не отвечало, когда во время компиляции не было обнаружено ошибок. Так что мне нужно знать, сломан ли мой код или моя Arduino? Я пробовал это на всех скоростях передачи, и вот некоторые из результатов, которые я получил. Обратите внимание, что я вставил в свой код задержки, чтобы замедлить работу, что не внесло изменений. Мне пришлось сделать снимок экрана, потому что символы не вставляли фрагмент. Последовательный вывод Arduino

А вот мой наполовину запеченный код, который, как вы заметите, полон циклов для отправки отдельных символов за раз (потому что это позволяет избежать некоторых безумных действий).

/**
 * EEPROM Reader/Dumper for EPROMS or EEPROMS.
 * 
 * @version 1.0.0.0
 * @author  Bit Fracture
 * @date    2015.05.23
 */

//Defining the address lines (four additional pins are manual)
int     a_pins[10]  = {2,3,4,5,6,7,8,9,10,11};

//Defining the 8-bit data pins
int     d_pins[8]   = {12,13,14,15,16,17,18,19};

//Store our current address (start at binary 0)
boolean address[10] = {0,0,0,0,0,0,0,0,0,0};

//Store our serial output data (start at binary 0)
boolean data[8]     = {0,0,0,0,0,0,0,0};

void setup()
{
  //Start communication with the computer
  Serial.begin(115200);
  delay(100);

  //Set address pins to output
  for (int i=0; i < sizeof(a_pins); i += 1)
  {
      pinMode(a_pins[i], OUTPUT);

      //Tell Serial this pin's status
      Serial.println("PO: " + (a_pins[i]));
      delay(100);
  }

  //Set data pins as input
  for (int i=0; i < sizeof(d_pins); i += 1)
  {
      pinMode(d_pins[i], INPUT);

      //Tell Serial this pin's status
      Serial.println("PI: " + (d_pins[i]));
      delay(100);
  }

  //Warn start
  Serial.println("BEGINNING TRANSMISSION");
}

void loop()
{
  //Calculate new binary address
  boolean carry = 1; //Start with a carry to initiate increment process
  for (int i=0; i < sizeof(address); i += 1)
  {
    boolean _temp = ((address[i] || carry) && (!address[i] || !carry));
    carry         = (address[i] && carry);
    address[i]    = _temp;
  }

  //Set output pins to new values
  for (int i=0; i < sizeof(a_pins); i += 1)
  {
    digitalWrite(a_pins[i], address[i]);
  }

  //Allow for the changes to propagate through the EPROM circuitry
  delay(250);

  //Read the inputs
  for (int i=0; i < sizeof(d_pins); i += 1)
  {
    data[i] = digitalRead(d_pins[i]);
  }

  //Output the address
  for (int i = sizeof(address); i > 0; i--)
  {
    if (address[i] == 1)
      Serial.print("1");
    else
      Serial.print("0");
  }
  Serial.print(": ");

  //Output the value
  for (int j = sizeof(data); j > 0; j--)
  {
    if (data[j] == 1)
      Serial.print("1");
    else
      Serial.print("0");
  }
  Serial.println();

  //Keep things from going too fast for now
  delay(1000);
}

Проще говоря: мне нужно понять, почему похоже, что последовательные данные вначале стремительно выводятся в память программы вместо того, чтобы отправлять строку, которую они должны были, и почему я не могу сделать что-то столь же простое, как приращение двоичного числа. и вывести на серийник!

Спасибо всем


person Bit Fracture    schedule 24.05.2015    source источник


Ответы (1)


вы отправляете двоичные числа в последовательный порт и не конвертируете их в ascii, сделайте это небольшое изменение в своем установочном коде, преобразовав двоичные числа в ascii,

char my_buffer_ax[10];
char my_buffer[200];


  memset(my_buffer, 0, 200);
  strcat(my_buffer, "PO: "); 
  //Set address pins to output
  for (int i=0; i < sizeof(a_pins); i += 1)
  {
      pinMode(a_pins[i], OUTPUT);

      //Tell Serial this pin's status
      memset(my_buffer_ax, 0, 10);
      itoa(a_pins[i], my_buffer_ax, 10); 
      strncat(my_buffer, my_buffer_ax, strlen(my_buffer_ax)); 
      delay(100);
  }
  Serial.println(my_buffer);

  memset(my_buffer, 0, 200);
  strcat(my_buffer, "PI: "); 
  //Set data pins as input
  for (int i=0; i < sizeof(d_pins); i += 1)
  {
      pinMode(d_pins[i], INPUT);

      //Tell Serial this pin's status
      memset(my_buffer_ax, 0, 10);
      itoa(d_pins[i], my_buffer_ax, 10); 
      strncat(my_buffer, my_buffer_ax, strlen(my_buffer_ax)); 
      delay(100);
  }
  Serial.println(my_buffer);
person faljbour    schedule 24.05.2015
comment
Я нормально отправляю ASCII, но мне нужно: A) Уметь увеличивать двоичное значение, хранящееся в виде логического массива (который должен быть довольно простым, но, по-видимому, не на моем Arduino) и B) Правильно отправлять данные по последовательному каналу связь. У меня никогда раньше не было такой проблемы с программами, ни разу. Собственно говоря, я собираюсь взять несколько старых набросков и посмотреть, что они делают. - person Bit Fracture; 24.05.2015
comment
Хорошо, предыдущие наброски кода работают нормально. Единственные двоичные числа, которые я отправляю, объединяются со строкой, так что не должна ли передача нормально? Приведенный выше код, похоже, значительно усложняет отправку пары чисел, чем это должно быть. - person Bit Fracture; 24.05.2015
comment
Хорошо, ваше решение работает, но вот дополнительное решение, которое я нашел намного проще для того небольшого фрагмента кода, который у меня был: String outstr = "PO: "; outstr.concat(d_pins[i]); Serial.println(outstr); - person Bit Fracture; 24.05.2015