언어/Python

Python SCPI Block Data 생성 / 추출

darkdevilness 2017. 8. 5. 21:59
728x90

func_test.py

드디어 SCPI 명령어에서 block data 를 만들고 data를 추출하는 방법을 찾았다. 

Python 을 기준으로 하였고 ,  C/C++ / Perl 로 충분히 변환 가능하다. 

기본 입력은 Byte 기준이며 string 으로 입출력 변환이 가능하게 만들었다. 


참조: http://na.support.keysight.com/pna/help/latest/Programming/Learning_about_GPIB/Getting_Data_from_the_Analyzer.htm



'''

Created on 2017. 8. 5.


@author: HOME

'''


'''

Block Data

Block data is used to transfer measurement data. Although the analyzer will accept either definite length blocks or indefinite length blocks, 

it always returns definite length block data in response to queries unless the specified format is ASCII. 

The following graphic shows the syntax for definite block data:


 -> # -> <num_digits> -> <byte_count> -> <data> -> <NL> -> <END> ->


<num_digits> specifies how many digits are contained in <byte_count>

<byte_count> specifies how many data bytes will follow in <data bytes>

Example of Definite Block Data

#210ABCDE+WXYZ<nl><end>

Where:

    # - always sent before definite block data

    2 - specifies that the byte count is two digits (2)

    10 - specifies the number of data bytes that will follow, not counting <NL><END>

    ABCDE+WXYZ - 10 digits of data

    <NL><END> - always sent at the end of block data


'''


import os,sys,time,io,datetime

from time import sleep


#############################################################################

### BlockData_Write(data)

### data [ASCII or String]

### return [ASCII]

#############################################################################

def BlockData_Write(data):

    DataType='asc'

    bblockdata="";blockdata=""


    if('ASC' != DataType.upper()):

        byte_count = len(data)

        num_digits= len(str(byte_count))        

        blockdata ='#'+str(num_digits)+str(byte_count)+data+"\n"

        bblockdata= blockdata.encode()  

    else:

        byte_count = len(bytearray(data))

        num_digits= len(str(byte_count))                

        blockdata =b'#'+str(num_digits).encode()+ str(byte_count).encode()+data+b'\n'

        bblockdata= blockdata              

    

    return bblockdata

#############################################################################

### BlockData_Read(blockdata)

### data [ASCII]

### return [ASCII or String] by DataType [asc |str]

#############################################################################

def BlockData_Read(blockdata):

    DataType="asc"

    data="";num_digits="";byte_count=""

    if('#' is chr(blockdata[0])):

        num_digits=int(chr(blockdata[1]))

        byte_count=int(blockdata[2:(2+num_digits)])

        if('ASC' !=DataType.upper()):

            data =blockdata[(2+num_digits):-1].decode()

        else :

            data =blockdata[(2+num_digits):-1]

    return data



if __name__ == '__main__':

    pass


data=b'9876543210'

print(BlockData_Read(BlockData_Write(data)))

728x90