Нет ответа от прибора по последовательной связи

Я использую 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()

, 👍0

Обсуждение

Комментарии не предназначены для расширенного обсуждения; этот разговор был [перенесен на chat](https://chat.stackexchange.com/rooms/128792/discussion-on-question-by-baccandr-no-response-from-instrument-via-serial-commun)., @Juraj


1 ответ


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

3

Переключатель Sparkfun RS232 - не очень хорошее устройство. Он зависит от того, к чему он подключен (через 9-контактный порт), обеспечивая отрицательную шину для уровней напряжения EIA-232.

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

Соедините их вместе, и никто не обеспечит это отрицательное напряжение.

Вместо этого вы должны использовать преобразователь на основе MAX232 (или MAX3232 для работы на 3,3 В). Он имеет встроенный удвоитель напряжения и инвертор напряжения для преобразования 5 В в +/-10 В, чтобы обеспечить надлежащий сигнал, совместимый с EIA-232, которым устройство должно быть удовлетворено.

,