如何在verifone vx520上使用调制解调器(rs232)发送数据?

时间:2015-08-27 11:55:31

标签: point-of-sale verifone

我想在verifone vx520上使用调制解调器rs-232(COM3)发送数据。如何初始化它以及如何包含它的库?我如何拨打verifone vx520?

h_modem = open(DEV_COM3 , 0);

1 个答案:

答案 0 :(得分:2)

我对你的问题有点困惑。 COM3是内置调制解调器的com端口,但是当我们谈到rs-232时,我想到520上的端口1或570上的2 - 无论哪种方式,它都适用于外部调制解调器,而我是猜你不是在说那个...... 此外,您的示例代码为CLOCK分配句柄,而不是调制解调器。错字?

“Verix eVo ACT程序员指南”的第10章将成为您与调制解调器相关帮助的朋友。同样文档的“调制解调器引擎函数调用”部分也是如此(我的版本中的第275页)。

我将xmodem库用于我的调制解调器功能。我包含了用于调制解调器通信的代码。

请求

如果您使用的是VMAC,那么首先您必须请求调制解调器设备(如果您没有使用VMAC,请跳到下一部分)。有人给我一次的提示是先关闭组合模式。这是37x0终端(Verix),可能不再相关,但我仍然这样做:

set_combo_mode(0)

然后我发送一个在我的.rck文件中定义的自定义事件,如下所示:

(HIGH,  MODEM_REQUEST_EVENT,    MODEM_EVENT,    {(COMM_3)})

如果您使用的是VMAC,您应该已经熟悉此表被定义为“优先级,输入事件,输出事件,设备”的事实。进一步的解释超出了这个答案的范围。

打开

接下来,您需要打开调制解调器并获取句柄:

hModem = open(DEV_COM3, 0);

请务必验证hModem> 0并处理不存在的情况。

<强> INITIALIZE

首先,你必须初始化终端&lt; - &gt;调制解调器接口:

struct Opn_Blk Com3ob;

Com3ob.rate = Rt_115200;
Com3ob.format = Fmt_A8N1; //another common rate is Fmt_A7E1
Com3ob.protocol = P_char_mode;
Com3ob.parameter = 0;

set_opn_blk(hModem, &Com3ob);

注意:通信速率可能比调制解调器连接快,因为调制解调器可以一个速度与主机系统通信,也可以与另一个终端通信。请注意,总是使终端调制解调器的速度大于调制解调器的主机速度是明智的。

然后,您可能还需要向调制解调器发送初始化字符串,以设置调制解调器与您拨入的服务器之间的通信选项:

write(hModem, "+++", 3); // put the modem into "Command mode"
write(hModem, ATString, ATStringLength); // be sure ATString ends with '\r'
//read(hModem, buffer, readLength) --> process the response. 
// How you do that will depend on if echo and or verbose is on

<强> DIAL

int result = xmdm_get_line_dial(hModem, dial_string, &iWrite, hClock, 30);

文件说明:

  

dial_string必须是包含有效拨号的以空字符结尾的字符串   信息(见表18),并且必须足够大以容纳   此函数使用的四个额外命令字符。最长的   可以发送的Hayes命令是40个字节。

     

当xmdm_get_line_dial()返回时,iwrite包含字节数   写入调制解调器命令缓冲区,而dial_string包含   完整的拨号命令字符串,其字符串长度应等于   iwrite成功拨号。

请注意,上面的“30”是以秒为单位的超时。如果传入0,则不会超时。

检查result以确保连接(Hayes的一些明智的人决定将这些连接值分开):

if( result == CONNECT ||
    result == CONNECT_300 ||
    result== CONNECT_1200 ||
    (result >= CONNECT_600 && result <= CONNECT_115200) )

发送&amp;接收数据

int totalBytesRead = xmdm_receive_data(hModem, buffer, 1, 1, 1000);

从[hMmodem]读入,[缓冲],([1] - 签名),最多[1]个字符,在[1000]“厘秒”(100秒,即10秒)后超时。请注意,totalBytesRead在出错时将为负数。检查文档中的各种可能的返回值。

int totalBytesSent = xmdm_send_data (hModem, buffer, i, 300);

从[buffer]发送[i]个字节到[hmodem],在[300]“centiseconds”(3秒)后超时。请注意,totalBytesSent在出错时将为负数。检查文档中的各种可能的返回值。

关闭

close(hModem);

返回VMAC

EESL_send_event("DEVMAN", COMM_3_RELEASED_EVENT, (unsigned char*) 0, 0);