为了更好地理解串行端口通信,我尝试编写一些示例代码,其中Matlab运行循环,该循环不断将数据发送到串行端口,而在同一Windows机器上运行的Python脚本侦听此端口,然后接收并打印任何接收到的数据。
在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的这一部分工作正常,因为它每隔半秒钟就会打印一次“运行”。
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已在使用该端口,因为它向其发送信息,但是我不明白,为什么会出现这个问题。一个程序向它发送数据而另一个程序从中接收数据不是很好吗?
亲切的问候。
答案 0 :(得分:2)
恐怕您无法通过两个不同的进程连接到同一串行端口。
这意味着,如果您从Matlab打开串行端口进行写入,则无法从Python打开它进行读取。
串行端口旨在将数据从一台计算机发送到另一台计算机或设备,以在不同的应用程序之间不共享数据(这样做有更好的方法,例如写入文件或共享内存块)。
话虽如此,如果您想做的是出于调试目的或只是学习,您可能想研究com0com,它可以使您创建一对 virtual (软件)串口。这与将两个硬件(真实)串行端口相互连接相同。从现在开始,您有两个端口,您可以从一个端口发送Matlab的数据,而从另一个端口读取Python的数据。
这是有关串行端口的最经常出现的问题之一,因此您应该能够找到很多好的资源。您可能要启动here。