Последовательная связь с Arduino Uno в шестнадцатеричном формате и мониторинг ответа с помощью последовательного монитора - PullRequest
0 голосов
/ 04 июля 2019

У меня есть проект, в котором мне нужно отправить массив шестнадцатеричных байтов из Arduino Uno на стороннее устройство через последовательную связь, устройство выполняет действие и отвечает массивом байтов, также в шестнадцатеричном виде после короткого время (+ -500мс).

Интерфейс USB USART стороннего производителя используется для записи ответа от устройства стороннего производителя на компьютер по каналу Bluetooth между устройством TX стороннего устройства и приемником USART RX. Arduino TX и стороннее устройство RX являются проводными.

Теперь проблемный бит:

Мой проект требует, чтобы Arduino также захватывал ответ от стороннего устройства, обрабатывал ответ и, в зависимости от значения, запускал различные выходы (светодиоды).

Мне также нужна возможность отладки Arduino, чтобы удостовериться, что получаемые шестнадцатеричные значения обрабатываются правильно и что выход выводится соответствующим образом.

Код, который у меня есть (компилируется, но не работает так, как я ожидал), приведен ниже:

byte one_shot_FAST[] = {0xAA, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x02, 0x23};

int IncomingByte = 0;

uint8_t q1 = 0;
uint8_t q2 = 0;
uint16_t qtot = 0;
int qVal = 0;
int qValMax = 65535;

const int triggerPin = 2;
int triggerState = LOW;


void setup() {

 Serial.begin(19200);
 pinMode(triggerPin, INPUT);

     Serial.println("<Arduino is ready>");

}

void loop() {

triggerState = digitalRead(triggerPin);

if (triggerState == HIGH){
  Serial.write(&one_shot_FAST[0], sizeof(one_shot_FAST));
  //while(!Serial.available());
  IncomingByte = Serial.read();

for (int i=0; i<13; i++) {
  while(!Serial.available()); //wait for character
  IncomingByte = Serial.read();
  Serial.println(IncomingByte,HEX);
delay(10);
}

Я ожидаю следующего ответа: AA 00 00 22 00 03 00 00 03 2B 01 E1 35

но я получаю строку "#" и квадратный блок после каждого "#"

Вот так выглядит схема: Architecture diagram

1 Ответ

0 голосов
/ 05 июля 2019

Давайте рассмотрим ваш вопрос:

Я пытаюсь отправить HEX линию на устройство через последовательную связь и прочитать ответ обратно ...

Вы не говорите, какое устройство, нужно предположить, что указанное устройство не является ни Arduino, о котором вы говорите позже, ни компьютером.

... при мониторинге транзакции.

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

... но я не читаю правильную передачу и какой-либо ответ через USB.

Если ваш Arduino подключен к вашему компьютеру через USB, в общем сценарии (который вы не могли бы быть, но вы не хотели объяснять), вы уже используете аппаратный последовательный порт Arduino для этой цели (последовательный монитор включен твой компьютер).

Итак, где же "устройство" подключено к вашему Arduino? Если вы имеете в виду, что подключили его к контактам 0 и 1, когда Arduino подключен к компьютеру через USB, то мы нашли вашу проблему.

Из официальной документации :

На Uno, Nano, Mini и Mega контакты 0 и 1 используются для связи с компьютером. Подключение чего-либо к этим контактам может помешать этому обмену , в том числе вызвать неудачные загрузки на плату.

Наконец, вы говорите:

... хотя внешний адаптер USART показывает правильный ответ.

Очевидно, вы подразумеваете, что подключаете свое «устройство» к компьютеру с помощью адаптера USB-последовательный порт, в то время как Arduino вообще не вмешивается. Полагаю, вы имеете в виду, что у вас есть терминальная программа, такая как PuTTY или RealTerm для Windows или Minicom для Linux, вы открываете сеанс для виртуального последовательного порта (созданного при подключении вашего кабеля), вводите команду и нажимаете вводную команду. Если это так, учтите, что команда, которую вы пишете с помощью Arduino, не заканчивается на CR или LF. Ваше устройство требует завершения линии? Можно только догадываться ...

Теперь с вашим кодом. Не зная, что вы хотите сделать, или с большим количеством пробелов в догадках, не очень легко дать вам много отзывов.

Но эта строка кажется особенно загадочной:

Serial.write(&one_shot_FAST[0], sizeof(one_shot_FAST));

Поскольку one_shot_FAST является байтовым массивом (для всех целей указателем), поэтому, когда вы используете &one_shot_FAST[0], вы просите записать адрес, который первый элемент массива занимает в памяти. Я не уверен, что вы думаете по этому поводу, но я думаю, что вы можете отказаться от &, чтобы вместо этого отправлять фактические байты в вашей команде.

В вашем коде есть и другие странные вещи: вы пишете в порт и мгновенно (вероятно, даже до того, как данные отправляются в буфер TX) читаете один байт. Я предполагаю, что это приведет к Serial.read() возвращению -1.

РЕДАКТИРОВАТЬ : Я проверил ваш код, и часть записи (очевидно, у меня нет оборудования, чтобы ответить на команду) работает нормально. Квадрат и тире, которые вы видите, наиболее вероятны из-за того, что вы используете последовательную консоль Arduino, которая пытается отобразить значения HEX больше 127 в виде ASCII, поэтому она не знает, как их отображать. Если вы используете терминал, способный отображать HEX, команда будет отображаться правильно. И, конечно же, у вас есть проблема с попыткой подключения более двух устройств к шине.

...