使用GPIB-232CT-A的帮助提示
概览
GPIB-232CT-A是一个串口至GPIB的接口,它可以将任何具有一个RS-232端口的计算机转换为一个GPIB发送器、侦听器或控制器;该接口也可以作为一个串口至GPIB的转换器,使得串行设备可以与GPIB直接连接。GPIB-232CT-A不仅具有与标准GPIB插入式接口卡相同的功能特性,还支持用户用笔记本电脑开发轻型的GPIB测试与测量应用程序。
该文档描述了各种问题,以帮助您在不同平台上和不同操作模式下成功配置和操作GPIB-232CT-A。
引言
GPIB-232CT-A作为系统控制器时,要将GPIB-232CT-A配置为S操作模式。在此情况下,您利用NI-488.2驱动软件和相关的GPIB函数与例程,开发与GPIB仪器和外设接口的应用软件。或者,您可以避免使用NI-488.2驱动,而是利用直接发送至GPIB-232CT-A的底层命令开发应用程序。这样使得语言接口库和NI-488.2驱动软件相关的软件开销降至最低,用户从而可以开发更快更小的GPIB执行程序。这一方式也使得用户可以利用调制解调器技术和现有的电信链路开发控制远程测试站的应用程序。GPIB-232CT-A用户手册提供了这些底层函数(称之为“S-模式函数”)的列表。值得注意的是,无论是否使用NI-488.2驱动软件或S-模式函数,您的GPIB-232CT-A都是工作于S-模式,通过串口与您的计算机相连。
除了可以作为发送器、侦听器或控制器使用外,GPIB-232CT-A还可以用作GPIB与具有串口的外设和仪器间的接口。在所谓的G-模式操作模式下,GPIB-232CT-A接受来自GPIB的信息,并将其传递至具有串口的仪器或外设。与S-模式相似,也有一组G-模式函数用于配置您的GPIB-232CT-A的操作特性。例如,通过发送srqen 0命令至GPIB-232CT-A首地址可以禁用GPIB-232CT-A的SRQ特性。详细信息请查看GPIB-232CT-A用户手册。
对于范围必须超过50英尺的应用,您可以使用我们的GPIB-232CT-A——通过一个RS-485实现GPIB控制。GPIB-485CT-A具有与GPIB-232CT-A相同的功能特性,但其距离范围可达1.2 km(4000英尺)。与RS-232不同,RS-485是一种多点、差分接线模式,其中每个传输线都参考一个独立的地。差分传输使得RS-485不易受到因传输线效应引起的噪声和电压衰减的影响。倘若这些因素对于您的应用至关重要,请与NI接洽以获取关于使用GPIB-485CT-A的进一步信息。
另请查阅:
GPIB-232/485CT-A 用户手册
配置您的GPIB-232CT-A以工作于DOS或Windows环境
本章节所提供的信息将有助于您配置您的GPIB-232CT-A——使其以S-模式与您计算机上的RS-232端口协同工作。
在DOS环境下安装
在成功安装面向DOS的NI-488.2驱动软件后,利用位于GPIB发布目录下的ibconf.exe编辑驱动配置。指定您将要使用的COM端口,并查验确保I/O基地址和中断通道与您的电脑上的设置相匹配。如欲完成该项工作,一种可能的方式是调用称为Microsoft诊断程序(MSD)的Microsoft例程。该例程可以通过在DOS提示符键入msd进行调用。您将从报告COM端口信息的部分获得每个可用COM端口当前所使用的I/O基地址和中断通道。通常,COM1用作鼠标接口,所以您往往希望使用除COM1外的其他COM端口作为您的GPIB-232CT-A的接口。表1包含了COM1到COM4的标准基地址和IRQ设置的列表。除非您改变了PC COM端口的配置,否则直接接受ibconf.exe中I/O基地址和中断优先级的默认设置就可以了。
表1.标准COM端口设置
|
Com端口 |
基地址 |
IRQ设置 |
|
COM1 |
0x3F8 |
4 |
|
COM2 |
0x2F8 |
3 |
|
COM3 |
0x3F8 |
4 |
|
COM4 |
0x2F8 |
3 |
IRQ设置可以根据您的系统分配IRQ资源的方式进行调整。在作任何调整之前,您应确保已经了解调整IRQ设置将对您的系统和COM端口所产生的影响。
除I/O基地址与IRQ配置外,验证GPIB-232CT-A的波特率、数据位数、停止位数和奇偶校验选择是否与对应COM端口相一致也很重要。任何DOS引用都会包含如何修改COM端口设置的信息。建议您将相关的调用命令写入autoexec.bat文件,这样每次您的计算机加载DOS时,您的COM端口将自动完成配置。例如,对于MS-DOS 5.0版本,命令模式com2: 96,n,8,1,n可以被添加入批处理文件,以便将COM2配置为9600波特率、没有奇偶校验、8个数据位、1个停止位和不作重试。任何时候如果您需要修改配置,仅需对autoexec.bat中的这一行进行编辑。
环境下安装
在安装了面向Windows的NI-488.2驱动软件后,利用Wibconf.exe指定将要使用的COM端口。双击GPIB程序组中的wibconf图标,或通过文件管理器访问位于GPIB发布目录下的Wibconf.exe文件。若您希望访问COM3或COM4,应确保您的comm.drv文件支持这些额外的端口。在一些编程环境下,如LabWindows/CVI,您可以通过某些定义的函数打开并配置COM端口。在其他情况下,COM端口可能就按现状打开,这时非常重要的一点就是要验证当前配置与GPIB-232CT-A的配置是否一致。您可以从程序管理器(Program Manager)的主程序组(Main Program Group)进入控制面板(Control Panel)以察看和编辑COM端口的当前配置。这里,选择“端口(Ports)”,将弹出一个窗口列出所有可用的COM端口。选中您希望配置的端口,并点击设置按钮。在弹出的设置窗口中,您可以配置波特率、数据位、奇偶校验、停止位和流控制等参数。点击高级按钮,您可以察看与修改该特定COM端口所对应的I/O基地址和中断优先级。请在没有清楚了解与PC接口的COM端口之前,勿修改这些设置。
操作模式的选择
S-模式
在S-模式配置下,GPIB-232CT-A可以充当一个系统控制器,所完成的任务包括总线上的地址发送与接受、信息跨总线传输的管理和GPIB上各种设备提出的服务请求的管理等。
无论用不用NI-488.2驱动软件,您都可以使用GPIB-232CT-A。当结合驱动使用时,您可以将GPIB-232CT-A视为一个标准的插入式GPIB接口卡。NI-488.2将NI-488函数和NI-488.2例程转换为通过串口对GPIB控制器的调用。如欲使用这一方法,需安装NI-488.2驱动软件,然后将我们的编程语言接口链接至GPIB应用程序,或者使用我们的开发环境之一,如LabWindows CVI——它将GPIB库直接结合到软件环境中。
除了使用NI-488.2驱动软件外,您也可以选择利用GPIB-232CT-A专用的、S-模式编程函数访问GPIB-232CT-A。这些底层函数(其汇总见附录A)可以使NI-488.2驱动软件相关开销降至最小,减少了执行时间,并得到一个更小的编译后程序。然而, NI-488.2驱动软件提供了一个与其他NI GPIB接口兼容的高层易用的API。您应当在开发您的GPIB应用程序时仔细考虑这些因素。同时注意到,由于S-模式命令直接写至GPIB-232CT-A,所以在通过串口发送命令至控制器时,符合每条命令指定的终止要求非常关键。关于S-模式的其他信息以及S-模式函数的详细列表,请参阅GPIB-232/485CT-A用户手册。
除了附录A中出现的S-模式函数外,附录B也包含了用LabWindows CVI编写的两个S-模式编程范例。读完一遍这些范例后,您就会清楚地发现,编程语言加快了对计算机COM口的访问速度,减少了开发时间。
G-模式
G-模式用于实现一个串行设备到GPIB的接口。在此应用场景下,另一个GPIB控制器管理GPIB,并通过GPIB-232CT-A与串行设备进行通信。本质上,GPIB-232CT-A充当了一个高性能的GPIB到串口的转换器。需要注意的是,将GPIB-232CT-A配置为G-模式时如何进行编址是非常重要的。您通过DIP开关所指派的GPIB地址被称为GPIB首地址,实际上是GPIB-232CT-A的配置寄存器的GPIB地址。您可以利用一些G-模式函数修改GPIB-232CT-A的操作参数(关于G-模式函数的细节,请查看GPIB-232/485CT-A用户手册)。访问串行设备的地址将等于首地址加1。因而,当GPIB-232CT-A工作于G-模式时,您实际上使用了两个GPIB地址。例如,假设GPIB首地址为6,那么访问串行设备所使用的GPIB地址为7。
另请查阅:
GPIB-232/485CT-A 用户手册
排线要求
GPIB-232CT-A使用两种线缆配置:一种是DTE到DCE的接口;另一种是DTE到DTE的接口,它也称为零调制解调器线缆配置。DTE、DCE分别指数据终端设备和数据通信设备。这两种排线具有9-9或9-25针脚配置。GPIB-232/485CT-A用户手册的附录D详细介绍了这些线缆及RS-232的最低要求。在设置GPIB-232CT-A时,选择正确的排线对您非常关键。下面章节阐述了DTE到DCE和DTE到DTE间的差别,以及存在这两种接口方法的必要性。
DTE到DCE
最初创建这一RS-232配置的目的在于,实现数据终端设备(DTE)到数据通信设备(DCE)(如调制解调器)的接口。缩略语DTE和DCE意味着串行通信接口的控制信号与数据信号的排列。在DTE配置中,针脚2用于传输数据,而针脚3则用于接受数据。在DCE配置中,针脚2用于接收数据,而针脚3则用于发送数据。DTE接口到DCE接口间的排线被称为直连连接,其中DTE的针脚2和3分别与DCE的针脚2和3相连。
DTE到DTE
注意,当连接两个DTE接口时,直连连接不再适用,因为对于串行通讯链接的两端,针脚2都用于发送,而针脚3都用于接收。不同于直连连接的实现,线缆中的排线进行了交叉,使得一端的针脚2与另一端的针脚3相连。由于我们不再将一个终端或计算机连接到一个串行通信设备(调制解调器),术语零调制解调器电缆(null modem cable)被用于描述需要交换线缆中相应信号的排线。术语全零调制解调器线缆(null modem cable)意味着该线缆不仅满足对RS-232的最小要求,而且提供实现数据跨串行连接的硬件握手所需的控制线路。
串行通信所需的最小线缆配置是RXC(接收)线路、TXD(发送)线路和GND(接地)。如果不需要硬件握手,那么构成RS-232的其他信号不被使用。GPIB-232/485CT-A用户手册的附录D描述了该项工作如何完成。
另请查阅:
GPIB-232/485CT-A 用户手册
通用操作说明
通常,GPIB-232CT-A与计算机串行(COM)端口相连。应确保您没有使用已被配置或分配给其他设备使用的端口。在启动DOS前通过检查您的BIOS确认COM端口设置正确。BIOS中包含哪些外部接口端口当前处于启用或禁用状态的信息。完成该项步骤之后,利用操作系统内的软件例程正确配置该COM端口的参数。此外,应确保为所需应用选择正确的开关设置。这些将包括操作模式(S-模式或G-模式)、波特率、数据位数、停止位数和奇偶校验模式等。如果通过串口的操作不再可靠,您或许希望利用CTS(清除发送)和RTS(请求发送)硬件握手线路来管理RS-232数据传输。为支持硬件握手,您的设备必须与CTS和RTS信号兼容,您必须采用全零调制解调器线缆连接设备与GPIB-232CT-A间的所有信号。降低波特率也会使信息的串行传输变得稳定。如果您工作于9600或更高的波特率,采用硬件握手以避免传输中的数据丢失就非常重要。本文的附录A是GPIB-232/485CT-A用户手册中的一个简要摘录。它详细介绍了关于控制器如何实现数据缓存和硬件握手的信息。这一信息对于理解硬件握手的概念非常关键。
故障排除
为了排除故障,您也可以使GPIB-232CT-A工作于终端仿真。在此情形下,GPIB-232CT-A被设置为S-模式,来自您的PC的一个哑终端或终端仿真软件程序通过串口与GPIB-232CT-A接口。因而,您可以利用S-模式命令实现与控制器的交互式接口。当您熟悉了S-模式函数在命令发送至控制器后如何返回信息的过程之后,这一方法就会非常有用。您也可以利用终端仿真验证GPIB-232CT-A是否工作正常。
实现终端仿真的一个简便方式便是使用位于程序管理器(Program Manager)中附件程序组(Accessories Program Group)内的“Windows终端(Windows Terminal)”应用程序。您可以使用终端仿真、终端参数选择和位于“设置(Settings)”下拉式菜单中的“通信(Communications)”选项来配置您的终端对话。然后,通过一个零调制解调器线缆将串口连接至GPIB-232CT-A,并利用onl、sic和id等命令验证与您的控制器的通信。为了验证您的线缆的完整性,将其从GPIB控制器上断开并短接针脚2和针脚3(例如回形针就可以),并禁用终端参数选择中的“本地回应(local echo)”。将“通信(Communications)”中的流控制(Flow Control)改为无(none),并开始在您的终端或PC键盘上输入信息。输入的任何信息都应当反馈至屏幕。这样将确保信息流如预期那样经过线缆。可以使用连续性测试仪验证其他信号通过线缆的连续性。
一个终端对话范例如下所示:
终端:onl 1 <回车> 联机GPIB-232CT-A控制器。无返回。
终端:sic <回车> 发送清除接口的命令至控制器。ATN LED灯亮。无返回。
终端:id <回车> 返回产品标识、固件版本和RAM大小。
范例响应:GPIB-232CT-A B.2版本
(c) 1992 NI版权所有
256K字节RAM
除了上面提及的几项命令外,如果在DOS操作环境下,您还可以使用msd例程验证COM端口当前设置和中断分配,以及GPIB终止并驻留程序(TSR)是否加载到内存。注意,如果您在计算机的启动过程中没有看见一个蓝色的NI驱动软件标记出现,那么gpib.com则没有被加载。需确认在您的config.sys文件中是否含有调用语句device=<boot drive>\<path>\gpib.com。例如,一个调用范例为device=C:\gpib-ct\gpib.com,其中,C:\对应于启动驱动盘,gpib-ct对应于包含所有GPIB发布文件(包括gpib.com)的目录。
上电自检
GPIB-232CT-A具有上电自检功能,该功能在设备上电时执行。一旦GPIB-232CT-A加电,POWER LED便打开。约8秒钟后,READY LED也应该打开。如果没有出现这些现象,那么GPIB-232CT-A上电自检失败,您应当联系NI技术支持人员以获得进一步的帮助。
编程范例(请参见附录B)
范例1:S-模式编程PC到PC
该段代码描述了如何将GPIB-232CT-A作为从设备使用。该段代码仿真了Fluke 45的功能特性。该应用非常适用于为正在开发的设备创建软件仿真。
范例2:远程GPIB应用中的S-模式编程
该段代码描述了您如何访问一个GPIB-232CT-A并通过调制解调器从GPIB设备收集数据。关于更多详细信息,敬请查看利用GPIB-232CT-A实现GPIB远程控制。
另请查阅:
利用GPIB-232CT-实现GPIB远程控制
附录A——S-模式函数汇总
|
I/O函数 |
|
|
|
高层总线管理函数 |
清除指定设备 |
|
|
GPIB初始化函数 caddr address |
使GPIB-232CT-A在线/离线 |
|
|
串口轮询函数 |
|
|
|
底层次总线管理 |
|
|
|
并行轮询函数 |
|
|
|
串口函数 |
|
|
|
通用函数 |
|
|
数据缓存与握手策略
为了确保GPIB-232CT-A不会丢失输入的串行数据,两个保护机制可供使用——数据缓存和握手。
数据缓存
GPIB-232CT-A拥有一个内部RAM缓存,可以存储输入的串行数据,直至这些数据可以输出至GPIB端口。该RAM缓存的空间大小决定了GPIB-232CT-A在缓存被完全填满前可以接受多少串行数据
GPIB-232CT-A可以在其RAM缓存快满时通过与串行主机握手停止数据传输。当缓存几乎清空时,GPIB-232CT-A能够使用XON/XOFF软件握手协议和硬件握手协议。
握手
硬件握手函数在RS-232传输过程中总是处于活动状态,它使用请求发送(RTS)和清除以发送(CTS)信号线路。当GPIB-232CT-A就绪等待接受串行数据时,它使RTS线路处于有效状态。该信号保持有效直至GPIB-232CT-A数据缓存近乎填满。此时,GPIB-232CT-A通过使RTS线路处于无效状态,发信令通知串行主机该GPIB-232CT-A不再可以接受数据。串行主机应当监测RTS线路,并当RTS线路变为无效状态时停止数据传输。GPIB-232CT-A再次就绪可以接受串行数据时使RTS线路变为有效状态。
GPIB-232CT-A还能够在串行主机不再就绪接受数据时停止数据传输。通过配置,GPIB-232CT-A在CTS变为无效状态时立即停止传输串行数据。一旦CTS线路恢复有效状态时,GPIB-232CT-A重新启动数据传输。
由于绝大多数串行设备使用与GPIB-232CT-A相同的硬件握手形式,您可以通过使用一个连接GPIB-232CT-A RTS信号和串行设备CTS信号的串行线缆,实现双向流控。此外,串行设备RTS信号应当与GPIB-232CT-A CTS信号相连。通过这样的配置,每个设备监测另一个设备的RTS信号,并当需要防止数据丢失时停止数据传输。关于排线策略的更多信息,敬请查阅GPIB-232/485CT-A用户手册的附录D。
另请查阅:
GPIB-232/485CT-A 用户手册
附录B——编程范例
/**********************************************************/
/* This is an S-mode programming example in which the */
/* 232CT-A controller is set up as a Slave with GPIB */
/* Primary Address of 4. The program simulates responses of */
/* the Fluke 45 Multimeter when sent various command */
/* strings. This code responds to Device Level Comm by the Master.*/
/**********************************************************/
/* I recommend using this code running at 4800 baud. */
/* You may get erratic behavior when running at 9600 baud. */
/* If you have a UART that has a fairly large FIFO buffer */
/* to buffer incoming serial data, then try using 9600 */
/* otherwise choose a lower baud rate. */
/**********************************************************/
/* I use the Delay() function to smooth out timing problems */
/* when interacting with the serial port of my PC. */
/* Similar experimentation may be required to smooth out */
/* timing issues related to interacting with your PC */
/* serial port. */
/**********************************************************/
/* I wait for a single event in the "wait" mask. If you */
/* want to wait for multiple events, then you must check */
/* status and use IF statements to Mask out the desired */
/* event. */
/**********************************************************/
/* Author: Amar D. Patel */
/* Revision: 1.2 */
/* Date: 01/06/95 */
/**********************************************************/
/**********************INCLUDES****************************/
#include <userint.h>
#include <rs232.h>
#include <ansi_c.h>
#include <formatio.h>
#include <utility.h>
/**********************DEFINES******************************/
#define SIZE 50
#define ID "*IDN?"
#define MEAS1 "VAL1?"
#define MEAS2 "*SRE 1; VAL1?"
#define STOP_EXECUTION "quit"
#define TRUE 1
#define FALSE 0
#define SRQ 4096
/****************USER DEFINED FUNCTION PROTOTYPES************/
void CheckGPIBError (char *); /**Currently UnUsed!**/
void CheckCOMportError (int);
void StringInit(void);
void ReadAllStatus(void);
void CTAInit(void);
/****************GLOBAL VARIABLES****************************/
int ComError; /*COM port error*/
int BytesWritten; /*Bytes Written on COM Writes*/
int BytesRead; /*Bytes Read on COM Reads*/
int inQlen; /*COM port input Q length*/
int exit_prgm = FALSE;
int strLength; /*Command String Length*/
int stat;
charCommand[SIZE];
charStatus[10]; /*GPIB Status*/
charGPIBerr[5]; /*GPIB Error number*/
charSPerr[5]; /*Serial Port Error number*/
charcount[5]; /*Byte count or reads or writes*/
charMeas_data[10]; /*Random Voltage*/
double randmNum; /*Random Number for generating random voltage*/
/***************MAIN PROGRAM**********************************/
main(){
ComError = OpenComConfig (2, "COM2", 4800, 0, 8, 1, 512, 512);
CheckCOMportError(ComError);
ComError = SetCTSMode (2, 1);
CheckCOMportError(ComError);
CTAInit(); /** Initialize 232 CT-A **/
while (exit_prgm == FALSE) {
Delay(2);
FlushInQ (2);
inQlen = 0;
BytesWritten = ComWrt (2, "wait 4\r\n", 8);/** Wait to be addressed as Listener **/
while (inQlen < 4 ) { /** Check input Q for data **/
inQlen = GetInQLen (2);
}
StringInit(); /** Reset Data strings with null **/
ReadAllStatus();
BytesWritten = ComWrt (2, "rd #50\r\n", 8);/** Direct CT-A to read data on GPIB **/
FillBytes (Command, 0, 50, 0);
BytesRead = ComRdTerm (2, Command, 50, 13);/** Read Data out from Serial Input Buffer **/
/**********IF-ELSE STATEMENTS USED TO MASK FOR INPUT STRING*********/
if ( CompareStrings (STOP_EXECUTION, 0, Command, 0, 0) == 0) {
MessagePopup ("232 CT-A Status", "Quitting Application");
exit_prgm = TRUE;
}
else if ( CompareStrings (ID, 0, Command, 0, 0) == 0) {
Delay(2);
FlushInQ (2); /**Flush Serial Input Q and Resest inQlength**/
inQlen =0;
BytesWritten = ComWrt (2, "wait 8\r\n", 8);/**Wait to be addressed as a Talker**/
while (inQlen < 4 ) {
inQlen = GetInQLen (2); /**Wait for status to be returned**/
}
StringInit();
ReadAllStatus();
BytesWritten = ComWrt (2, "wrt #30\nFLUKE, 45, 5000163, 1.6 D1.0\r\n", 38);
}
else if ( CompareStrings (MEAS1, 0, Command, 0, 0) == 0) {
Delay(2);
FlushInQ (2);
inQlen = 0;
randmNum = (double) rand() / 32767 * 2.1;
Scan (&randmNum, "%f>%s", Meas_data);
strLength = StringLength (Meas_data);
BytesWritten = ComWrt (2, "wait 8\r\n", 8);
while (inQlen < 4 ) {
inQlen = GetInQLen (2);
}
StringInit();
ReadAllStatus();
BytesWritten = ComWrt (2, "wrt\n", 4);
BytesWritten = ComWrt (2, Meas_data, strLength);
BytesWritten = ComWrt (2, "\r\n", 2);
}
else if ( CompareStrings (MEAS2, 0, Command, 0, 0) == 0) {
Delay(2);
FlushInQ (2);
randmNum = (double) rand() / 32767 * 2.1;
Scan (&randmNum, "%f>%s", Meas_data);
strLength = StringLength (Meas_data);
Delay(5);
BytesWritten = ComWrt (2, "rsv 70\r", 7); /* Set SRQ:Processing done*/
Delay(2);
FlushInQ (2);
inQlen = 0;
BytesWritten = ComWrt (2, "wait 8\r\n", 8);
while (inQlen < 4 ) {
inQlen = GetInQLen (2);
}
StringInit();
ReadAllStatus();
BytesWritten = ComWrt (2, "wrt\n", 4);
BytesWritten = ComWrt (2, Meas_data, strLength);
BytesWritten = ComWrt (2, "\r\n", 2);
}
else { Delay(2);
FlushInQ (2);
inQlen = 0;
BytesWritten = ComWrt (2, "wait 8\r\n", 8);
while (inQlen < 4 ) {
inQlen = GetInQLen (2);
}
StringInit();
ReadAllStatus();
BytesWritten = ComWrt (2, "wrt #40\nINVALID COMMAND: Awaiting Next Command\r\n", 48);
}
}/* end while*/
Delay(5);
ComError = CloseCom (2);
CheckCOMportError(ComError);
}
/***************************************************/
/* Function: CheckCOMportError */
/* Parameters: int error value returned */
/* Return Value: NONE */
/* Description: This function checks the COM port */
/* error code and returns the appropriate message. */
/* Error codes are referenced in LWCVI user manual. */
/***************************************************/
void CheckCOMportError (int err_value) {
if (err_value < 0) {
MessagePopup ("Communications Error", "Com Port Error: Program Aborted.");
exit (0);
}
}
/**********************************************************/
/* Function: CTAInit */
/* Parameters: NONE */
/* Return Value: NONE */
/* Description: This function Initializes the GPIB */
/* 232 CT-A for EOI, Primary Address 4 and */
/* Non-Controller. */
/*********************************************************/
void CTAInit(void) {
BytesWritten = ComWrt (2, "onl 1\r", 6);
BytesWritten = ComWrt (2, "eot 1\r", 6);
BytesWritten = ComWrt (2, "caddr 4\r", 8);
BytesWritten = ComWrt (2, "rsc 0\r", 6);
}
/***********************************************************/
/* Function: StringInit */
/* Parameters: NONE */
/* Return Value: NONE */
/* Description: This function initializes the status */
/* information returned by the "wait" command.*/
/***********************************************************/
void StringInit(void) {
FillBytes (Status, 0, 10, 0);
FillBytes (GPIBerr, 0, 5, 0);
FillBytes (SPerr, 0, 5, 0);
FillBytes (count, 0, 5, 0);
}
/****************************************************/
/* Function: ReadAllStatus */
/* Parameters: NONE */
/* Return Value: NONE */
/* Description: This function reads all status */
/* information returned by "wait". */
/***************************************************/
void ReadAllStatus(void) {
BytesRead = ComRdTerm (2, Status, 10, 13);
BytesRead = ComRdTerm (2, GPIBerr, 5, 13);
BytesRead = ComRdTerm (2, SPerr, 5, 13);
BytesRead = ComRdTerm (2, count, 5, 13);
}
/*************************************************************/
/* Remote GPIB Using the GPIB-232CT-A Source Code */
/*************************************************************/
/**************************INCLUDES**************************/
#include <formatio.h>
#include <gpib.h>
#include <userint.h>
#include <ansi_c.h>
#include <utility.h>
#include <rs232.h>
/***************************FUNCTION PROTOTYPES******************/
void CheckCOMportError (int);
void ReadAllStatus(void);
void CheckGPIBError(void);
/**************************GLOBALS*******************************/
static intComError;
static intBytesWritten;
static intBytesRead;
static int Flag;
static inthandle;
static inthexStat;
static int InQLen;
charStatus[10];
charGPIBerr[5];
charSPerr[5];
charcount[5];
chardatabuf[100];
charDCbuf[100];
charTimeout[5];
charspoll[5];
/*****************************MAIN*****************************/
main(){
/*************OPEN & CONFIGURE COM2: HW HANDSHAKE**********/
ComError = OpenComConfig (2, "COM2", 2400, 0, 8, 1, 512, 512);
CheckCOMportError(ComError);
ComError = SetCTSMode (2, 1);
CheckCOMportError(ComError);
/*************CONNECT TO REMOTE MODEM*******************/
BytesWritten = ComWrt (2, "ATQ0V1E1S0=0\r\n", 14);
Delay (2);
BytesWritten =ComWrt (2, "ATDT97945775\r\n", 14);
Delay(2);
FlushInQ (2);
InQLen = 0;
while (InQLen < 14) {
InQLen = GetInQLen (2);
}
BytesRead = ComRd (2, databuf, 80);
if (strncmp(databuf, "\r\nCONNECT 2400", 14) == 0)
printf("Connection Succesful!\n");
else { printf("No Carrier: Connect Unsuccessful!\n");
exit (0);
}
/**********************GPIB 232CT-A INTERFACING****************/
/* Command: *IDN? returns instrument ID from 488.2 Instrument. */
/* Command: *SRE 16 enables the Service Request Enable register */
/* of a 488.2 instrument. Instrument will assert SRQ */
/* when data ready. */
/* Command: VAL1? instructs our device to return DC voltage. */
/****************************************************************/
Delay (2);
FlushInQ (2);
BytesWritten = ComWrt (2, "onl 1\r", 6);
CheckGPIBError();
BytesWritten = ComWrt (2, "sic\r", 4);
CheckGPIBError();
BytesWritten = ComWrt (2, "wrt 8\n*IDN?\r\n", 13);
CheckGPIBError();
BytesWritten = ComWrt (2, "rd #70 8\r\n", 10);
BytesRead = ComRdTerm (2, databuf, 100, 13);
CheckGPIBError();
printf("%s\n", databuf);
BytesWritten = ComWrt (2, "wrt 8\n*SRE 16\r\n", 15);
CheckGPIBError();
BytesWritten = ComWrt (2, "wrt 8\nVAL1?\r\n", 13);
CheckGPIBError();
Delay (2);
FlushInQ (2);
InQLen = 0;
BytesWritten = ComWrt (2, "wait 4096\r", 10);
while (InQLen < 4) {
InQLen = GetInQLen (2);
}
ReadAllStatus();
Scan (Status, "%s>%d", &hexStat);
if(hexStat & 0x1000) {
BytesWritten = ComWrt (2, "rsp 8\r", 6);
BytesRead = ComRdTerm (2, spoll, 5, 13);
BytesWritten = ComWrt (2, "rd #70 8\r\n", 10);
BytesRead = ComRdTerm (2, DCbuf, 100, 13);
}
/********************DISCONNCT FROM REMOTE MODEM**************/
BytesWritten = ComWrt (2, "onl 0\r", 6);
CheckGPIBError();
FlushOutQ (2);
BytesWritten = ComWrt (2, "+++", 3);
Delay(2);
BytesWritten = ComWrt (2, "ATH\r\n", 5);
Delay(3);
/*******************CLOSE COM2**************************/
ComError = CloseCom (2);
CheckCOMportError(ComError);
}/***END MAIN***/
/*******************FUNCTION DECLARATIONS**************************/
/***************************************************************/
/* Function: CheckCOMportError */
/* Parameters: int error value returned */
/* Return Value: NONE */
/* Description: This function checks the COM port */
/* error code and returns the appropriate message. */
/* Error codes are referenced in LWCVI user manual.*/
/***************************************************************/
void CheckCOMportError (int err_value) {
if (err_value < 0) {
MessagePopup ("Communications Error", "Com Port Error: Program Aborted.");
exit (0);
}
}
/******************************************************/
/* Function: ReadAllStatus */
/* Parameters: NONE */
/* Return Value: NONE */
/* Description: This function reads all status */
/* information returned by "wait". */
/******************************************************/
void ReadAllStatus(void) {
BytesRead = ComRdTerm (2, Status, 10, 13);
BytesRead = ComRdTerm (2, GPIBerr, 5, 13);
BytesRead = ComRdTerm (2, SPerr, 5, 13);
BytesRead = ComRdTerm (2, count, 5, 13);
}
/*************************************************************/
/* Function: CheckGPIBError */
/* Parameters: NONE */
/* Return Value: NONE */
/* Description: This function reads all status */
/* information returned by "stat". If an error */
/* condition exists, display error code and exit prgm.*/
/**************************************************************/
void CheckGPIBError (void) {
int GPIBErrCode;
int hexStat;
int InQlen;
Delay (2);
FlushInQ (2);
BytesWritten = ComWrt (2, "stat n\r", 7);
while (InQLen < 4) {
InQLen = GetInQLen (2);
}
ReadAllStatus();
Scan (Status, "%s>%d", &hexStat);
Scan (GPIBerr, "%s>%d", &GPIBErrCode);
if (hexStat < 0) {
printf("GPIB Error: GPIB error code = %d\n", GPIBErrCode);
exit (0);
}
}
相关链接:
GPIB-232/485CT-A User Manual GPIB-232/485CT-A用户手册
法律条款
本教程由National Instruments公司(简称“NI”)开发。 尽管National Instruments可为该程序提供技术支持,但是该指南的内容并非完全通过测试和验证,NI不以任何方式保证其质量,也不保证相关产品或驱动程序的新版本出现时继续为其提供技术支持。本教程仅以其“现状”向用户提供,教程没有任何担保。教程使用受ni.com网站上《使用条款》的约束。 (http://ni.com/legal/termsofuse/unitedstates/us/)
