使用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() |
加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW
或用微信扫描左侧二维码