Проблемы с отправкой данных из Matlab в Python через последовательный порт - PullRequest
1 голос
/ 10 октября 2019

, чтобы лучше понять связь через последовательный порт, я пытаюсь написать пример кода, где в Matlab работает цикл, который непрерывно отправляет данные на последовательный порт, в то время как скрипт Python, работающий на той же машине Windows, слушает этот порт,затем получает и печатает все полученные данные.

В Matlab я написал простой цикл, который отправляет 99 тестовых сигналов на порт COM1,

% Setup a serial port and open it
tep=serial("COM1", "Baudrate", 9600);
fopen(tep);

% this loop is supposed to send a number to a serial port repeatedly
n = 1; % counter variable
while n < 100
    fprintf(tep,"50"); % Send data to serial port
    n = n + 1;      % Counter variable
    pause(0.5)      % Sleep to make this loop run for a total of 50s0
    fprintf('run'); % Test output within matlab to check, whether it runs
end

% finally close the serial port
fclose(tep);

, насколько я могу судить, этоMatlab part работает, так как печатает «run» каждую секунду.

Прослушиватель Python:

import serial
import time
# set up the serial line same as in Matlab
ser = serial.Serial('COM1', 9600)
time.sleep(2)

# Read and record the data
data =[]                       # empty list to store the data
for i in range(50):
    b = ser.readline()         # read a byte string
    string_n = b.decode()  # decode byte string into Unicode  
    string = string_n.rstrip() # remove \n and \r
    flt = float(string)        # convert string to float
    print(flt)
    data.append(flt)           # add to the end of data list
    time.sleep(0.1)            # wait (sleep) 0.1 seconds

ser.close()

# show the data

for line in data:
    print(line)

Запуск скрипта на Python приводит к следующей ошибке:

serial.serialutil.SerialException: could not open port 'COM1': PermissionError(13, 'Zugriff verweigert', None, 5)

Очевидно, порт уже используется Matlab, так какон посылает информацию ему, но я не понимаю, почему это проблема. Разве это не должно быть хорошо, если одна программа отправляет данные в нее, а другая получает данные из нее?

С уважением.

1 Ответ

2 голосов
/ 10 октября 2019

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

Это означает, что если вы открываете последовательный порт из Matlab для записи, вы не можете открыть его из Python для чтения.

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

Сказав, что, если вы пытаетесь сделать это для целей отладки или просто для изучения, вы можете захотеть исследовать com0com , который позволяет вам создать пару virtual (программное обеспечение) последовательных портов. Это было бы то же самое, что иметь пару аппаратных (реальных) последовательных портов, соединенных друг с другом. Поскольку теперь у вас есть два порта, вы можете отправлять данные из Matlab на один и читать из Python на другой.

Это один из наиболее часто задаваемых вопросов о последовательных портах, поэтому вы сможете найти много полезных ресурсов. Вы можете начать здесь .

...