Нет ответа от прибора по последовательной связи
Я использую Teensy 3.6 для связи с внешним прибором через последовательное соединение. Однако я не могу заставить прибор реагировать на мои команды. Идея состоит в том, чтобы отправить команду с компьютера через последовательный монитор на Teensy, который затем может отправить ее на прибор (я знаю, что Teensy не нужен в этой конфигурации, но это просто для тестирования более сложной настройки). Прибор использует разъем RS232, поэтому я использую этот переключатель RS232 для подключения его к Teensy. Параметры последовательной связи прибора следующие: скорость передачи данных 38,4 к, 8 бит данных, 1 стоп-бит, четности нет, и символ возврата каретки должен отмечать конец командной строки.
Простой пример моего кода для считывания входных данных с последовательного монитора и отправки команды прибору:
#define FILTser Serial1
char Command;
void setup() {
Serial.begin(9600);
FILTser.begin(38400);
Serial.println("<Teensy is ready>");
}
void loop() {
Command = 'X';
recvCmd();
// Start sampling command
if (Command == 'S') {
FILTser.write("pumpctl=1\r");
FILTser.write('\n');
Serial.println("Sampling started");
}
}
void recvCmd() {
if (Serial.available() > 0) {
Command = Serial.read();
}
}
Если я прочитаю вывод с Teensy порта Serial1 с помощью Putty, я правильно получу сообщение. Если я отправлю ту же команду непосредственно инструменту с помощью Putty или Python, я получу, что инструмент ответит так, как я ожидаю. Это означает, что прибор работает, и последовательный вывод с крошки также в порядке, так что я действительно не понимаю, что может быть не так.
Я знаю, что прибор не отвечает, потому что я ожидал бы, что насос включится, когда он получит команду. Кроме того, я попытался прочитать ответ прибора на последовательном порту, и я получал -1
, но я ожидал бы ОК
для хорошей команды и ОШИБКИ
, если команда не распознана.
Чтобы прочитать ответ прибора на последовательном порту, я попытался использовать как один символ с ответом = filter.read (),
так и полную строку, используя код отсюда.
Пример кода Python, который я использую для отправки команд инструменту, выглядит следующим образом:
import datetime
import serial
import io
import time
# =============================================================================
# Настройка последовательного порта
# =============================================================================
ser = serial.Serial()
ser.baudrate = 38400
ser.port = 'COM5'
ser.timeout = 1
#%% Define FILT functions
def FILT_send(commnd):
ser.write(commnd.encode('ascii'))
time.sleep(0.5)
value_read = ser.readline().decode('ascii')
return(value_read)
def FILT_control():
global q
user_input = input('Type:\n \
- S to start sampling\n \
- E to end sampling\n \
- Q to quit the program\n')
if user_input == 'S':
FILT_send('pumpctl=1\r')
print('Sampling started')
if user_input == 'E':
FILT_send('pumpctl=0\r')
print('Sampling ended')
if user_input == 'Q':
print('The end')
q = False
#%% Main
ser.open()
q = True
while q:
FILT_control()
ser.close()
@baccandr, 👍0
Обсуждение1 ответ
Лучший ответ:
Переключатель Sparkfun RS232 - не очень хорошее устройство. Он зависит от того, к чему он подключен (через 9-контактный порт), обеспечивая отрицательную шину для уровней напряжения EIA-232.
Это нормально, когда вы подключаетесь к чему - то, у кого есть эти напряжения, например, к компьютеру, но многие "устройства" этого не делают-у них самих внутри будет аналогичный переключатель и они будут полагаться на то, к чему они подключены, для обеспечения необходимого отрицательного напряжения.
Соедините их вместе, и никто не обеспечит это отрицательное напряжение.
Вместо этого вы должны использовать преобразователь на основе MAX232 (или MAX3232 для работы на 3,3 В). Он имеет встроенный удвоитель напряжения и инвертор напряжения для преобразования 5 В в +/-10 В, чтобы обеспечить надлежащий сигнал, совместимый с EIA-232, которым устройство должно быть удовлетворено.
- Последовательная связь между ESP8266 и Arduino Uno
- Как связаться с датчиком через порты RX/TX Arduino?
- Программирование Arduino Micro через RX/TX
- Serial Comm. проблема синхронизации между Arduino и Pyserial
- Как прервать соединение HM10 Bluetooth?
- Двоичный в десятичный с использованием побитовых операторов
- Arduino считывает состояние подключения устройства hc-05
- Возможно ли двунаправленное UART-соединение по одному проводу передачи данных?
Комментарии не предназначены для расширенного обсуждения; этот разговор был [перенесен на chat](https://chat.stackexchange.com/rooms/128792/discussion-on-question-by-baccandr-no-response-from-instrument-via-serial-commun)., @Juraj