Не могу обмениваться данными по RS232 между ардуино и Lakeshore Fluxmeter. Как получить данные от флюксметра?

Я использую Arduino Leonardo и экран DFrobot RS232, чтобы попытаться установить связь с измерителем потока. Я пытаюсь написать "ЕДИНИЦЫ?", чтобы флюсметр отправил обратно один байт, который будет преобразован в единицы измерения, которые он использует.

Проблема в том, что я вижу со стороны Arduino, что он записывает эти 6 байтов, но в if (Serial1.available()) там ничего нет. У меня есть переключатель на щите, и я выполнил руководство на вики DFrobot, чтобы убедиться, что мой щит работает.

Я думаю, это связано с тем, как выполняется Serial1.write(). Я не думаю, что он получает команду правильно, поэтому он не отвечает.

Ниже показан мой код:

#include <Keyboard.h>

// Определите контакты, чтобы вам нужно было менять их только в одном месте
#define BUTTON 7
          
bool runner = 0;

void setup() {
  // Начать последовательную связь со скоростью 9600 бод
  Serial1.begin(9600);
  pinMode(BUTTON, INPUT);
  // создаем прерывание, которое будет вызывать send_command() всякий раз, когда на выводе кнопки появляется нарастающий фронт
  attachInterrupt(digitalPinToInterrupt(BUTTON), send_command, RISING);
  // запускаем процесс клавиатуры
  Keyboard.begin();
}

// вызывается при нажатии кнопки
// будем использовать Serial.write() для отправки команд
// затем будем записывать данные с клавиатуры
void send_command() {
  runner = 1;
  return;
}

void loop() {
  if (runner) {
    char pkneg, pkpos;
    // В следующем разделе команды записываются в 480,
    // затем считывает данные и печатает их в Serial Monitor
    int sent = Serial1.write("UNITS?");
    Keyboard.println(sent);
    if (sent <= 0) {
      Keyboard.print("Fort Myers we got a problem\n");
    }
    //Keyboard.print(маркер);
    delay(5000);

    if (Serial1.available()) {
      Keyboard.print("Here!\n");
      pkpos = Serial1.read();
  }
  else pkpos = 'x';
  pkneg = 'x';

  char pkneg1[10], pkpos1[10];
  // dtostrf(pkpos, 4, 3, pkpos1);
  // dtostrf(pkneg, 4, 3, pkneg1);

  Keyboard.print(pkneg);
  Keyboard.print('\t');
  Keyboard.print(pkpos);
  Keyboard.print('\n');

  // для тестирования

  runner =0;
  }
}

, 👍-1


1 ответ


2

В вашем серийном письме отсутствуют разделители строк. Как написано в руководстве:

  • Терминаторы привязаны к CRLF.

И в примере кода (Quick Basic, пожалуй, проще всего):

CMD$ = CMD$ + TERM$
PRINT #1, CMD$; 

(где TERM$ равно "\r\n").

Поэтому изменение вашего Serial1.write с включением терминаторов должно помочь устройству распознать, что вы завершили отправку команды, и оно должно ответить на нее:

Serial1.write("UNITS?\r\n");

Кстати, проверять возвращаемое значение Serial1.write бессмысленно. Он всегда будет возвращать количество символов в строке, которую вы предоставили - последовательные данные через контакты UART всегда отправляются, даже если там нет ничего, что могло бы их получить.

,

спасибо за вашу постоянную помощь! Терминаторы сначала не работали, но потом попробовал написать так: Serial1.write('U'); Serial1.write('N'); Serial1.write('Я'); Serial1.write('T'); Serial1.write('S'); Serial1.write('?'); Serial1.write('\r'); Serial1.write('\n'); и это сработало. Просто пытаетесь ПРОЧИТАТЬ? работать сейчас, потому что то, что он возвращает, это тарабарщина, лол, @Dominic Heye