文件传输
概述
这个样本程序说明外部控制器与E5071C之间的文件传输。
这个程序读出外部控制器(或E5071C)上指定文件的数据,然后将其写入E5071C的指定文件(或外部控制器)。
参见这个程序的文件管理。
在HT Basic中的样本程序(file_xfr.htb)
10 DIM Src_file$[50],Dst_file$[50],Src_size_char$[50],Inp_char$[30]
20 INTEGER Direction
30 ASSIGN @Agte507x TO 717
40 !
50 CLEAR SCREEN
60 ON ERROR GOTO Direct_select
70 Direct_select: !
80 PRINT "#### File Transfer ####"
90 PRINT " 1: E507x -> Controller"
100 PRINT " 2: Controller -> E507x"
110 PRINT ""
120 PRINT "Input 1 or 2"
130 INPUT "Number?",Inp_char$
140 Direction=IVAL(Inp_char$,10)
150 IF Direction<1 OR Direction>2 THEN Direct_select
160 OFF ERROR
170 !
180 PRINT ""
190 PRINT " Input source file name. ";
200 INPUT "Name?",Src_file$
210 PRINT ": "&Src_file$
220 !
230 IF Direction=2 THEN
240 PRINT " Input source file size. ";
250 INPUT "Size[Byte]?",Src_size_char$
260 PRINT ": "&Src_size_char$&"[Byte]"
270 END IF
280 !
290 PRINT " Input destination file name. ";
300 INPUT "Name?",Dst_file$
310 PRINT ": "&Dst_file$
320 PRINT ""
330 !
340 IF Direction=1 THEN
350 Copy_to_contr(@Agte507x,Src_file$,Dst_file$)
360 ELSE
370 Copy_to_e507x(@Agte507x,Src_file$,Src_size_char$,Dst_file$)
380 END IF
390 !
400 END
410 !=============================================
420 ! File Transfer Function (E507x -> Controller)
430 !=============================================
440 SUB Copy_to_contr(@Agte507x,Src_file$,Dst_file$)
450 DIM Img$[32],Src_size_char$[10],Buff$[9],Err_msg$[100]
460 INTEGER Max_bsize,Block_size,Err_no
470 REAL Src_size
480 !
490 ON ERROR GOTO Skip_purge
500 PURGE Dst_file$
510 Skip_purge: OFF ERROR
520 CREATE Dst_file$,1
530 ASSIGN @Dst_file TO Dst_file$
540 Max_bsize=24576 ! 24KByte
550 !
560 OUTPUT @Agte507x;"*ESE 60"
570 OUTPUT @Agte507x;"*SRE 32"
580 OUTPUT @Agte507x;"*CLS"
590 OUTPUT @Agte507x;"*OPC?"
600 ENTER @Agte507x;Buff$
610 !
620 ON INTR 7 GOTO Err
630 ENABLE INTR 7;2
640 PRINT "Now Copying: "&Src_file$&"(@E507x) -> "&Dst_file$&"(@Contro ller)"
650 OUTPUT @Agte507x;":MMEM:TRAN? """&Src_file$&""""
660 WAIT .1
670 ENTER @Agte507x USING "#,A";Buff$
680 ENTER @Agte507x USING "#,A";Digit$
690 Img$="#,"&Digit$&"A"
700 ENTER @Agte507x USING Img$;Src_size_char$
710 !
720 Src_size=VAL(Src_size_char$)
730 WHILE Src_size>0
740 IF Src_size>Max_bsize THEN
750 Block_size=Max_bsize
760 ELSE
770 Block_size=Src_size
780 END IF
790 !
800 ALLOCATE Dat$[Block_size]
810 Img$="#,"&VAL$(Block_size)&"A"
820 ENTER @Agte507x USING Img$;Dat$
830 OUTPUT @Dst_file USING Img$;Dat$
840 DEALLOCATE Dat$
850 !
860 Src_size=Src_size-Block_size
870 END WHILE
880 !
890 PRINT "Done"
900 ENTER @Agte507x USING "#,A";Buff$
910 ASSIGN @Dst_file TO *
920 !
930 GOTO Skip_error
940 Err: OFF INTR 7
950 OUTPUT @Agte507x;";:SYST:ERR?"
960 ENTER @Agte507x;Err_no,Err_msg$
970 PRINT "Error occurred!!"
980 PRINT " No:";Err_no,"Description: "&Err_msg$
990 Skip_error: OFF INTR 7
1000 SUBEND
1010 !=============================================
1020 ! File Transfer Function (Controller -> E507x)
1030 !=============================================
1040 SUB Copy_to_e507x(@Agte507x,Src_file$,Src_size_char$,Dst_file$)
1050 DIM Img$[32],Header$[10],Buff$[9],Err_msg$[100]
1060 INTEGER Max_bsize,Block_size,Err_no
1070 REAL Src_size
1080 !
1090 ON ERROR GOTO File_error
1100 ASSIGN @Src_file TO Src_file$
1110 OFF ERROR
1120 Max_bsize=24576 ! 24KByte
1130 !
1140 OUTPUT @Agte507x;"*CLS"
1150 OUTPUT @Agte507x;"*OPC?"
1160 ENTER @Agte507x;Buff$
1170 !
1180 PRINT "Now Copying: "&Src_file$&"(@Controller) -> "&Dst_file$&"(@ E507x)"
1190 Header$="#"&VAL$(LEN(Src_size_char$))&Src_size_char$
1200 OUTPUT @Agte507x;":MMEM:TRAN """&Dst_file$&""","&Header$;
1210 !
1220 Src_size=VAL(Src_size_char$)
1230 WHILE Src_size>0
1240 IF Src_size>Max_bsize THEN
1250 Block_size=Max_bsize
1260 ELSE
1270 Block_size=Src_size
1280 END IF
1290 !
1300 ALLOCATE Dat$[Block_size]
1310 Img$="#,"&VAL$(Block_size)&"A"
1320 ENTER @Src_file USING Img$;Dat$
1330 OUTPUT @Agte507x USING Img$;Dat$
1340 DEALLOCATE Dat$
1350 !
1360 Src_size=Src_size-Block_size
1370 END WHILE
1380 !
1390 OUTPUT @Agte507x;"",END
1400 ASSIGN @Src_file TO *
1410 !
1420 OUTPUT @Agte507x;";:SYST:ERR?"
1430 ENTER @Agte507x;Err_no,Err_msg$
1440 IF Err_no=0 THEN
1450 PRINT "Done"
1460 ELSE
1470 PRINT "Error occurred!!"
1480 PRINT " No:";Err_no,"Description: "&Err_msg$
1490 END IF
1500 GOTO Skip_error
1510 File_error:OFF ERROR
1520 PRINT "File name NOT found!"
1530 Skip_error:!
1540 SUBEND
说明
40行
为I/O通道分配GPIB地址。
60行到130行
如果发生错误(例如无效输入),这些行允许用户返回到输入起始行并重新输入数据,同时输入指示传输方向的数字。然后,这些行显示传输方向列表,并提示用户输入选择的数字。
80行到130行
这些行通过键入适当的数字显示传输方向列表,并提示用户选择多项中的一个。
140行到150行
将输入值转换成整数,并将其储存到方向变量。如果方向中包括无效值,可以返回到输入起始行。
180行到210行
这些行从用户输入获得用于复制的源文件名称,将其储存到Src_file$变量,并显示Src_file$值。
180行到210行
这些行从用户输入获得用于复制的源文件名称,将其储存到Src_file$变量,并显示Src_file$值。
230行到270行
如果方向值为2(从外部控制器到E5071C),这些行获得用于复制的源文件大小,将其储存到Src_size_char$,并显示Src_size_char$值。
290行到320行
这些行从用户输入获得用于复制的源文件名称,将其储存到Src_file$变量,并显示Src_file$值。
350行
如果方向值为1(从E5071C到外部控制器),这些行使用子程序Copy_to_contr将E5071C上名称为Src_file$的文件传输到外部控制器上名称为Dst_file$的文件上。
370行
如果方向值为2,这些行使用子程序Copy_to_e507x将外部控制器上名称为Src_file$的文件传输到E5071C上名称为Dst_file$的文件。
Copy_to_contr在第440到1000行出现,是将文件从E5071C传输到外部控制器的子程序,描述如下。
490行到520行
如果已经存在名为File$的文件,这些行删除该文件,并新创建一个名为File$的文件。
530行
为I/O口分配用于复制的目标文件。
540行
这行将每次传输的最大量传输数据(以字节为单位)储存到Max_bsize变量中,传输数据为24 K字节,以满足HTBasic中字符数组的大小限制。
560行到600行
当这些行出错,找不到用于复制的源文件时,这些行对系统进行配置,以发出SRQ。
620行到630行
这些行为SRQ中断设置分支目标,以启动SRQ中断。
640行到650行
这些行显示说明传输开始的消息,并执行读出E5071C上文件的数据的命令。
670行到680行
这些行读出块数据中的标题符(#),读出表示数据大小(以字节为单位)的数字(数字符号)个数,然后将其储存到Digit$变量中。
690行
这行创建Digit$中读取字符的格式。
700行
这行读取以字节为单位的数据大小,并将其储存到Src_size_char$变量。
720行
这行读取以字节为单位的数据大小,并将其储存到Src_size_char$变量。
730行到870行
这些行重复下面的程序,直到Src_size为0。
740行到780行: 如果Src_size比Max_bsize大,这些行将Max_bsize的值分配给Block_size变量(传输数据以字节为单位)。如果Src_size等于或小于Max_bsize,将Src_size的值分配给Block_size。
800行这行定义与Block_size大小相同的Dat$字符串变量,并将其储存在内存区域。
810行 这行定义与Block_size大小相同的Dat$字符串变量,并将其储存在内存区域。
820行 这行从E5071C的文件上读取数据,然后将其保存到Dat$。
830行 这行将Dat$的内容写入外部控制器的文件。
840行到860行 这些行清除Dat$的内存区域,并除去Src_size的Block_size。
890行到900行
这些行显示指示传输完成的消息,然后读取数据末尾的消息结束标志。
940行到980行
这些行定义差错处理器,处理器获取并显示发生差错的次数和消息。
Copy_to_e507x在第1040到1540行出现,它是将文件从外部控制器传输到E5071C的子程序,描述如下。
1090行到1110行
为I/O口分配用于复制的目标文件。
1120行
这行将每次传输的最大数量(24 K字节)传输数据(以字节为单位)储存到Max_bsize变量。
1140行到1160行
清除差错序列。
1180行
显示测量开始的消息。
1190行到1200行
这些行创建一个标题部分,该标题部分指示将发送Src_size_char$字节数量的数据,然后发送命令及其参数的标题部分,以将数据写到E5071C的文件上。
1220行
这行将Src_size_char$变量转换为实数,并将其保存到Src_size变量。
1230行到1370行
这些行重复下面的程序,直到Src_size为0。
1240行到1280行: 如果Src_size比Max_bsize大,这些行将Max_bsiize的值分配给Block_size变量(传输数据以字节为单位)。如果Src_size等于或小于Max_bsize,将Src_size的值分配给Block_size。
1300行 这行定义与Block_size大小相同的Dat$字符串变量,并将其储存在储存区域。
1310行 这行创建读取字符的格式,读取字符数量与Block_size字符的数量相同。
1320行 这行从外部控制器的文件上读取数据,然后将其保存到Dat$。
1330行 这行将Dat$的内容写到E5071C的文件上。
1340行行到1360行 这些行清除Dat$的储存区域,并除去Src_size的Block_size。
1390行
这行发送数据末尾的消息结束标志。
1420行行到1430行
这些行获取差错序列的差错次数和差错消息,然后分别将其储存到Err_no和Err_msg$变量中。
1440行到1490行
如果Err_no等于0(没有出现差错),这些行显示指示传输完成的消息,如果Err_no不等于0(出现差错),显示Err_no与Err_msg$。
1510行到520行
这些行处理没有找到要复制的源文件的情况。