使用Python进行SDS示波器屏幕图像捕获
、简介
下面是一个用Python 3.4编写的简短代码示例,它借助套接字,通过LAN从SIGLENT SDS1000X-E中提取显示图像(屏幕截图),并将其保存到控制计算机的本地驱动器中。
注意:此程序将图片/显示图像文件保存在同一目录中的.py文件。它将覆盖所有具有相同名称的现有文件。
下载Python 3.4,使用以太网电缆将示波器连接到LAN,获取示波器IP地址,然后运行附带的.PY程序以保存示波器显示的位图(BMP)图像。
您可以在此处下载.PY文件: Python_Socket_SDS_SCDP.zip
2、借助以下软件和仪器进行测试:
Python 3.4
SDS1202X-E
SDS1104/1204X-E
SDS2000X-E 型号
SDS5000X 型号
3、编程示例
1 | #!/usr/bin/env python 3.4.3 #-*- |
2 | coding:utf-8 –*- |
3 | #----------------------------------------------------------------------------- |
4 | #这段短脚本是一个打开套接字的例子, 发送查询来从作用域返回屏幕转储,将屏幕转储保存 |
5 | #为python文件中的BMP文件,并关闭套接字 |
6 | # |
7 | #目前在SDS1000X-E,2000X-E和5000X型号上进行了测试 |
8 | # |
9 | #不作任何明示或暗示的保证 |
10 | # |
11 | #SIGLENT/JAC 03.2019 |
12 | # |
13 | #----------------------------------------------------------------------------- |
14 | import socket #对于套接字 |
15 | import sys # 退出 |
16 | import time # 休眠 |
17 | #----------------------------------------------------------------------------- |
18 | |
19 | remote_ip = "192.168.55.100" # 应与仪器的IP地址相配 |
20 | port = 5025 #仪器服务的端口号 |
21 | |
22 | def SocketConnect(): |
23 | try: |
24 | #创建一个AF_INET, STREAM (TCP) 套接字 |
25 | s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) |
26 | except socket.error: |
27 | print ('Failed to create socket.') |
28 | sys.exit(); |
29 | try: |
30 | #连接到远程服务器 |
31 | s.connect((remote_ip , port)) |
32 | s.setblocking(0) # 非阻塞模式,当接收器没有检测到数据时发生异常 |
33 | #s.settimeout(3) |
34 | except socket.error: |
35 | print ('failed to connect to ip ' + remote_ip) |
36 | return s |
37 | |
38 | def SocketQuery(Sock, cmd): |
39 | try : |
40 | #发送cmd字符串 |
41 | Sock.sendall(cmd) |
42 | Sock.sendall(b'n') #命令终止 |
43 | time.sleep(1) |
44 | except socket.error: |
45 | #发送失败 |
46 | print ('Send failed') |
47 | sys.exit() |
48 | |
49 | data_body = bytes() |
50 | while True: |
51 | try: |
52 | time.sleep(0.01) |
53 | server_replay = Sock.recv(8000) |
54 | #print(len(server_replay)) |
55 | data_body += server_repla |
56 | except BlockingIOError: |
57 | print("data received complete..") |
58 | break |
59 | return data_body |
60 | ''' |
61 | PACK_LEN = 768067#您将收到的数据包长度; |
62 | #SDS5000X是2457659; SDS1000X-E / 2000X-E是768067 |
63 | had_received = 0 |
64 | data_body = bytes() |
65 | while had_received < PACK_LEN: |
66 | part_body= Sock.recv(PACK_LEN - had_received) |
67 | data_body += part_body |
68 | part_body_length = len(part_body) |
69 | #print('part_body_length', part_body_length) |
70 | had_received += part_body_length |
71 | return data_body |
72 | ''' |
73 | |
74 | |
75 | def SocketClose(Sock): |
76 | #关闭套接口 |
77 | Sock.close() |
78 | time.sleep(5) |
79 | |
80 | def main(): |
81 | global remote_ip |
82 | global port |
83 | global count |
84 | |
85 | #打开一个文件 |
86 | file_name = "SCDP.bmp" |
87 | |
88 | # 正文:打开套接字,查询屏幕转储,保存并关闭 |
89 | s = SocketConnect() |
90 | qStr = SocketQuery(s, b'SCDP') #请求屏幕图像 |
91 | print(len(qStr)) |
92 | f=open(file_name,'wb') |
93 | f.write(qStr) |
94 | f.flush() |
95 | f.close() |
96 | |
97 | SocketClose(s) |
98 | sys.exit |
99 | |
100 | if __name__ == '__main__'; |
101 | proc = main() |
评论