Чтение последовательного ввода Arduino

Я считываю ввод со своих весов Ohaus, используя его вывод RS232, используя этот код:

#define HWSERIAL Serial1

void setup() {
  Serial.begin(9600);
  HWSERIAL.begin(9600);
}

void loop() {
  int incomingByte;

  if (Serial.available() > 0) {
    incomingByte = Serial.read();
    Serial.print("USB received: ");
    Serial.println(incomingByte, DEC);
    //HWSERIAL.print("USB received:");
    //HWSERIAL.println(incomingByte, DEC);
  }
  if (HWSERIAL.available() > 0) {
    incomingByte = HWSERIAL.read();
    Serial.print("UART received: ");
    Serial.println(incomingByte);
    //HWSERIAL.print("UART received:");
    //HWSERIAL.println(incomingByte);
  }
}

Нажимая кнопку печати на весах, я ожидал, что данные будут приходить одним пакетом только с показаниями, но я получаю ожидаемые данные, но весы продолжают отправлять данные впоследствии (ES снова и снова) . Мне нужно разобрать только то, что нужно. Ниже приведены выходные данные консоли на моем компьютере.

UART received:  
UART received:  
UART received:  
UART received:  
UART received: 0
UART received: .
UART received: 0
UART received: 0
UART received:  
UART received:  
UART received:  
UART received:  
UART received:  
UART received:  
UART received: ?
UART received: (This is a CR)

UART received: (This is a LF)

UART received:  
UART received:  
UART received:  
UART received:  
UART received: 0
UART received: .
UART received: 4
UART received: 0
UART received:  
UART received:  
UART received:  
UART received:  
UART received:  
UART received:  
UART received: ?
UART received: G
UART received:  
UART received:  
UART received: (CR)

UART received: (LF)

UART received: E
UART received: S
UART received: (CR)

UART received: (LF)
... (The ES loops over and over until the print button is pressed again)

0,00 — это текущее показание весов, а 0,40 — вес тары. Это все, что мне нужно, и я не могу понять, как это разобрать. Блоки имеют разную длину, так как мне извлечь необходимую информацию и игнорировать повторяющийся «ES»? Я не уверен на 100 %, правильно ли я это делаю?

Вывод в формате DEC

UART received: 32
UART received: 32
UART received: 32
UART received: 32
UART received: 48
UART received: 46
UART received: 48
UART received: 48
UART received: 32
UART received: 32
UART received: 32
UART received: 32
UART received: 32
UART received: 32
UART received: 63
UART received: 13
UART received: 10
UART received: 32
UART received: 32
UART received: 32
UART received: 32
UART received: 48
UART received: 46
UART received: 52
UART received: 48
UART received: 32
UART received: 32
UART received: 32
UART received: 32
UART received: 32
UART received: 32
UART received: 63
UART received: 71
UART received: 32
UART received: 32
UART received: 13
UART received: 10
UART received: 69
UART received: 83
UART received: 13
UART received: 10
UART received: 69
UART received: 83
...

, 👍1

Обсуждение

Из руководства: http://dmx.ohaus.com/WorkArea/showcontent.aspx?id=4294974226 > Баланс вернет «ES» для недопустимых команд. Убедитесь, что вы используете правильные последовательные параметры, что линия RX подключена правильно., @jdwolf

Можете ли вы дать полный рабочий эскиз и вывод, который на самом деле из этого эскиза. Сделайте incomingByte целым числом и удалите приведение к char при печати. Распечатайте его как DEC или HEX, чтобы вы могли видеть количество символов, пробелов, переводов строки или других причудливых байтов., @Jot

Это настоящий сигнал RS-232? Что вы используете для преобразования его в сигнал уровня ttl? Если вы используете модуль, сообщите нам, какой модуль. Добавлю к вам вопрос о модели весов. Документ, упомянутый @jdwolf, показывает разные форматы для разных моделей. «г» — это единица измерения, а «?» нестабилен. Остальные должны вписаться в один из форматов. Я полагаю, что двухсимвольный «термин» - это cr lf., @Jot

Что ж, я попытался использовать Max 3232, но по какой-то причине весы не выдавали достаточного напряжения, чтобы вызвать отправку ttl, поэтому я подключил его напрямую к контакту 0 на leonardo, чтобы получить это показание и Я действительно получил вышеуказанные показания UART. Проблема заключалась в том, что 232 посылал ошибочные сигналы и вызывал проблемы. Я не понимаю, почему это сработало, потому что RS232 инвертирован из ttl, поэтому мое единственное предположение, что ohaus уже преобразует свой сигнал в ttl?, @polyhedron

Шум на вашей линии TX? Похоже, вы отправляете случайные данные, которые устройство не понимает., @tgunr

Я пытаюсь сделать почти то же самое с весами OHAUS Ranger 3000. Вы выяснили, какой сигнал поступает от OHAUS: 5 В TTL или 13 В RS232? Спасибо, @blaudp79


1 ответ


Лучший ответ:

2

Из руководства: http://dmx.ohaus.com/WorkArea/showcontent.aspx?id=4294974226

Баланс вернет «ES» для неверных команд.

Убедитесь, что вы используете правильные последовательные параметры, что линия RX подключена правильно.

,

Спасибо, это определенно помогло. Я просто удалил линию TX из Arduino, так как не отправляю данные на весы., @polyhedron