Не могу обмениваться данными по 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;
}
}
@Dominic Heye, 👍-1
1 ответ
В вашем серийном письме отсутствуют разделители строк. Как написано в руководстве:
- Терминаторы привязаны к CRLF.
И в примере кода (Quick Basic, пожалуй, проще всего):
CMD$ = CMD$ + TERM$
PRINT #1, CMD$;
(где TERM$
равно "\r\n").
Поэтому изменение вашего Serial1.write
с включением терминаторов должно помочь устройству распознать, что вы завершили отправку команды, и оно должно ответить на нее:
Serial1.write("UNITS?\r\n");
Кстати, проверять возвращаемое значение Serial1.write
бессмысленно. Он всегда будет возвращать количество символов в строке, которую вы предоставили - последовательные данные через контакты UART всегда отправляются, даже если там нет ничего, что могло бы их получить.
- Управление потоком между устройством ESP32 и RS323
- Связь между двумя ESP32, USART против RS232 с MAX3232
- Основная связь Arduino ModBus RTU с проблемой измерителя мощности
- Последовательная связь между ESP8266 и Arduino Uno
- Отправка значения с одного Arduino на другой
- SIM900 3G? Или SIM900A умеет подключаться к 3G?
- Контакты RX и TX на esp32
- Ардуино для чтения с преобразователя RS232 в последовательный модуль TTL
спасибо за вашу постоянную помощь! Терминаторы сначала не работали, но потом попробовал написать так:
Serial1.write('U'); Serial1.write('N'); Serial1.write('Я'); Serial1.write('T'); Serial1.write('S'); Serial1.write('?'); Serial1.write('\r'); Serial1.write('\n');
и это сработало. Просто пытаетесь ПРОЧИТАТЬ? работать сейчас, потому что то, что он возвращает, это тарабарщина, лол, @Dominic Heye