В чем отличие встроенного монитора и внешней программы?

Vlan
Offline
Зарегистрирован: 13.12.2016

Здравствуйте.

Arduino Pro Mini (5 В)
Написал небольшую программку, которая получает символ через компорт (это цифры и единственный буквенный символ -  f)  и зажигает светодиоды 7-сегментного индикатора. Она замечательно работает, когда отправляю данные через встроенный монитор. Как только пытаюсь сделать bat-файл или вывести что-то из 1С, ардуинка ведет себя, как будто ее ресетят. Причем, если в 1С я в отладчике прогоняю свою программу, то опять работет, как надо. Стоит только запустить обычный режим, снова не работает. 
Нагуглил конденсатор на ножку RST и GND. Но с ним у меня только не заливается скетч (как и должно быть по описанию), а вот нужного результата не добился. Что делаю не так? Подскажите, плиз.
На всякий случай привожу свой скетч. Может с ним накосячил?
 

#define FIRST_SEGMENT_PIN   2
#define SEGMENT_COUNT       8

// Всего цифр 10, поэтому в массиве 10 чисел + символ 'F'.
byte numberSegments[11] = {
  0b00111111,
  0b00001100,
  0b01011011,
  0b01011110,
  0b01101100,
  0b01110110,
  0b01110111,
  0b00011100,
  0b01111111,
  0b01111110,
  0b01110001
};
int j = 0;
int val = 0;
// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  Serial.begin(9600);
  //Serial.println("write");
  for (int i = 0; i < SEGMENT_COUNT; ++i)
    pinMode(i + FIRST_SEGMENT_PIN, OUTPUT);
  while (Serial.available() == 0) {
    int mask = numberSegments[0];
    for (int i = 0; i < 7; ++i) {
      boolean enableSegment = bitRead(mask, i);
      digitalWrite(i + FIRST_SEGMENT_PIN, enableSegment);
      if (i == 0) {
        digitalWrite(7, LOW);
      }
      else {
        digitalWrite(i + FIRST_SEGMENT_PIN - 1, LOW);
      }
      if (i == 5) {
        digitalWrite(2, enableSegment);
      }
      else {
        digitalWrite(i + FIRST_SEGMENT_PIN + 1, enableSegment);
      }
      digitalWrite( 8, LOW);
      delay(100);
    }
  }
}

// the loop function runs over and over again forever
void loop() {
   while (Serial.available() > 0) {
     delay(2);
    int val = Serial.read();
    if (val == 'f' || val == 'F') {                    //  если принят симовол 'f',...
      j = 10;
      }
    else {
      j = (char)val-48;
      }
    }
    int mask = numberSegments[j];
    // для каждого из 7 сегментов индикатора
    if (j < 10) {
      for (int i = 0; i < SEGMENT_COUNT; ++i) {
        // определяем: должен ли он быть включён.
        boolean enableSegment = bitRead(mask, i);
        // включаем/выключаем сегмент на основе полученного значения
        digitalWrite(i + FIRST_SEGMENT_PIN, enableSegment);
      }
    }
    else {
      while (Serial.available() == 0) {
        for (int i = 0; i < SEGMENT_COUNT; ++i) {
          digitalWrite(i + FIRST_SEGMENT_PIN, LOW); //гасим все пины
        }
        delay(500);
        for (int i = 0; i < SEGMENT_COUNT; ++i) {
          boolean enableSegment = bitRead(mask, i);
          digitalWrite(i + FIRST_SEGMENT_PIN, enableSegment); //выводим мигающий символ 'F'
        }
        delay(500);
      }
    }
}

 

Vlan
Offline
Зарегистрирован: 13.12.2016

Упс! Код не работает. Это я экспериментировал по мотивам поиска по теме. Если надо, приведу тот, который у меня 100% рабочий.

phoenixoid
Offline
Зарегистрирован: 14.07.2015

В батнике надо com настроить перед тем как отправлять данные. Типа так:

mode com3 baud=96 parity=n data=8 stop=1

Думаю тоже нужно делать и в Вашей проге...

Vlan
Offline
Зарегистрирован: 13.12.2016

Это сделано. Не помогает.

И сейчас я не пойму, что поменял. Раньше, если я монитор закрывал, то цифра на индикаторе у меня оставалась, а сейчас при закрытии идет сброс порта.
От USB-COM конвертера может зависеть такое поведение?