python实现TCP Socket控制测试仪器
说明
本例是用python实现TCP Socket,最终目的是为了控制LCR电容测试仪器。
前提条件
- 测试仪器 配备了以太网接口,支持TCP/IP协议栈
- 用户可以通过IP地址和端口号连接到仪器,建立TCP通信
- Python及socket包
代码
# 导入依赖包
import socket
# 获取socket套接字对象:供后续通信
def get_socket(ip_str, port):
# 设置默认超时时间:避免网络通信卡死。若5秒内未能完成操作(如连接、读取数据),会抛出异常
socket.setdefaulttimeout(5)
# 创建一个基于 IPv4 的 TCP 套接字,支持点对点可靠连接
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# ip地址 和 端口 进行连接
server_addr = (ip_str, port) # 具体地址和端口得看仪器
tcp_socket.connect(server_addr)
# tcp_socket.recv_into()
return tcp_socket
# 发送仪器指令:socket套接字对象, 仪器命令字符串
def socket_send_cmd(tcp_socket, cmd):
# 构建待发送命令字符串,命令以"\r\n"结尾:LCR仪器通常以标准通信协议(如 SCPI)解析命令,要求命令以 \r\n(回车+换行)结束。
send_str = cmd + "\r\n"
# 使用sendall将数据完整发送至远端设备,即便数据量较大,也能确保发送完成
tcp_socket.sendall(send_str.encode('utf-8'))
# 发送空字节以确保发送结束
tcp_socket.send(b"")
# 获取仪器返回结果:socket套接字对象
def socket_read_result(tcp_socket):
while True: # 无限循环,直到读取到完整结果
try:
global read_buf_g # 声明全局变量,用于存储读取的缓冲数据
result = tcp_socket.recv(256).decode('utf-8') # 从套接字中读取最多256字节数据
if "\n" in result: # 判断是否接收到完整行数据符号\n(行以“\n”换行符结束)
# 缓冲“\n”后的信息留给下一次拼接完整信息
tmp = result[result.find("\n")+1:] # +1:是为了去掉\n
# 拼接完整返回信息:# 将前面缓冲的数据 跟 这次读取数据‘\n’ 前面的数据 拼接
result = read_buf_g + result[:result.find("\n")]
# 把上面缓冲的信息放在全局变量中,方便下次获取
read_buf_g = tmp
# 退出循环,返回结果
break
# 如果本次接收信息还没有完整信息标志\n的话,则把信息加入缓存当中
read_buf_g += result
except Exception:
print("34 read timeout") # 若发生异常(如超时),打印提示信息并继续尝试读取
continue
return result
# 本例LCR电容测试仪器的ip设为 169.254.1.22,端口为5025
ser_dev = get_socket("169.254.1.22",5025)
# 发生测量指令(SCPI指令)
socket_send_cmd(ser_dev, ":FETC?")
# 获取结果
rd_data = socket_read_result(ser_dev)
# 打印结果
print(rd_data)
原文地址:https://blog.csdn.net/LXC_Fish/article/details/144112764
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!