Matlab与Python之间的通信和同步

本文详细介绍了MATLAB与Python之间通过TCP协议进行通信的过程,包括Python服务器的创建、MATLAB客户端的连接,以及数据的发送和接收。通过示例展示了如何在不同语言的系统间实现传感器和设备的控制协调。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Matlab与Python之间的通信和同步

MATLAB和Python之间可以按如下流程通信和同步:

  1. Python先搭建起一个"服务台“(服务器),等待MATLAB的”来访"(连接)。

  2. MATLAB主动"敲门"(创建客户端),与Python的"服务台"建立连接。

  3. 连接建立后,它们就可以开始"交谈"(发送和接收数据)了。

    • MATLAB说:“我给你发个1,你收到了吗?”(发送数字1)
    • Python回应:“收到了,我再给你发个2,你看看。”(发送数字2)
    • MATLAB说:“我收到2了,那我再给你发个3。”(发送数字3)
    • Python回应:“我收到3了,我再给你发个4。”(发送数字4)
  4. “交谈"结束后,它们友好地说了”再见“(关闭连接),结束了这次愉快的"握手”。

上述过程可以用于依赖不同语言的多个传感器、设备的控制及其协同。

深入理解MATLAB与Python的"握手":TCP通信的技术细节

首先,让我们来看看Python端的代码:

import socket

# 创建TCP服务器
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('localhost', 12345))
sock.listen(1)

print('Python: Waiting for connection')
conn, addr = sock.accept()
print('Python: Connected by', addr)

这段代码的作用是创建一个TCP服务器,并等待MATLAB的连接。其中,socket.AF_INET表示使用IPv4地址,socket.SOCK_STREAM表示使用TCP协议。sock.bind(('localhost', 12345))将服务器绑定到本地的12345端口。sock.listen(1)开始监听连接请求,参数1表示允许的最大连接数。

当MATLAB连接到这个服务器时,sock.accept()会返回一个新的socket对象conn,用于与MATLAB进行通信,以及连接的地址addr

接下来,让我们看看MATLAB端的代码:

% 创建TCP客户端对象
t = tcpclient('localhost', 12345);

这段代码创建了一个TCP客户端对象t,并连接到了Python服务器的地址('localhost')和端口(12345)。

连接建立后,MATLAB和Python就可以开始交换数据了。以MATLAB发送数字1为例:

% 发送数字1给Python
disp('MATLAB: Sending 1 to Python');
write(t, int8(1));

write(t, int8(1))将数字1转换为8位有符号整数(int8),并通过TCP连接t发送给Python。

在Python端,可以通过以下代码接收这个数字:

# 等待MATLAB发送数字1
print('Python: Waiting for 1 from MATLAB')
data = conn.recv(1)
print('Python: Received', int.from_bytes(data, byteorder='big'), 'from MATLAB')

conn.recv(1)从TCP连接读取1个字节的数据。int.from_bytes(data, byteorder='big')将这个字节转换回整数。

反过来,当Python发送数字给MATLAB时,使用的是conn.sendall()方法:

# 发送数字2给MATLAB
print('Python: Sending 2 to MATLAB')
conn.sendall(int.to_bytes(2, length=1, byteorder='big'))

int.to_bytes(2, length=1, byteorder='big')将数字2转换为一个字节,然后通过conn.sendall()发送给MATLAB。

在MATLAB端,使用read()方法读取这个数字:

% 等待Python发送数字2
disp('MATLAB: Waiting for 2 from Python');
while t.NumBytesAvailable == 0
    pause(0.1);
end
data = read(t, 1, 'int8');
disp(['MATLAB: Received ', num2str(data), ' from Python']);

while循环用于等待数据的到来。read(t, 1, 'int8')从TCP连接t读取一个字节,并将其转换为8位有符号整数。

最后,当通信结束时,双方都需要关闭TCP连接:

% 关闭TCP连接
clear t;
# 关闭TCP连接
conn.close()

这就是MATLAB与Python通过TCP进行通信的全部技术细节。虽然语法和函数名称因语言而异,但基本原理是相通的:创建连接,发送数据,接收数据,关闭连接。

完整代码如下:

Matlab端

% 创建TCP客户端对象
t = tcpclient('localhost', 12345);

% 发送数字1给Python
disp('MATLAB: Sending 1 to Python');
write(t, int8(1));

% 等待Python发送数字2
disp('MATLAB: Waiting for 2 from Python');
while t.NumBytesAvailable == 0
    pause(0.1);
end
data = read(t, 1, 'int8');
disp(['MATLAB: Received ', num2str(data), ' from Python']);

% 发送数字3给Python
disp('MATLAB: Sending 3 to Python');
write(t, int8(3));

% 等待Python发送数字4
disp('MATLAB: Waiting for 4 from Python');
while t.NumBytesAvailable == 0
    pause(0.1);
end
data = read(t, 1, 'int8');
disp(['MATLAB: Received ', num2str(data), ' from Python']);

% 关闭TCP连接
clear t;

Python端

import socket

# 创建TCP服务器
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('localhost', 12345))
sock.listen(1)

print('Python: Waiting for connection')
conn, addr = sock.accept()
print('Python: Connected by', addr)

# 等待MATLAB发送数字1
print('Python: Waiting for 1 from MATLAB')
data = conn.recv(1)
print('Python: Received', int.from_bytes(data, byteorder='big'), 'from MATLAB')

# 发送数字2给MATLAB
print('Python: Sending 2 to MATLAB')
conn.sendall(int.to_bytes(2, length=1, byteorder='big'))

# 等待MATLAB发送数字3
print('Python: Waiting for 3 from MATLAB')
data = conn.recv(1)
print('Python: Received', int.from_bytes(data, byteorder='big'), 'from MATLAB')

# 发送数字4给MATLAB
print('Python: Sending 4 to MATLAB')
conn.sendall(int.to_bytes(4, length=1, byteorder='big'))

# 关闭TCP连接
conn.close()
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不再更新,请勿购买!!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值