【问题标题】:how to send data with modem (rs232) on verifone vx520?如何在verifone vx520上使用调制解调器(rs232)发送数据?
【发布时间】:2015-08-27 11:55:30
【问题描述】:

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

h_modem = open(DEV_COM3 , 0);

【问题讨论】:

  • verifone 是目标调制解调器还是源调制解调器?如果是源调制解调器,我相信verifone有自己的语言称为tcl,除非这个版本使用编译的c,就像rover一样。如果这是一个目标,您将需要使用源代码支持的语言或连接源调制解调器的主机 PC 支持的语言在源代码中编写代码。您的问题与数据通信有关吗?还是关于在 verifone tcl 中编程?
  • VeriFone 在(很多)旧型号(如 Zon 和 Tranz 终端)中使用了 TCL。从“Omni”系列(如 3200)开始,他们转向标准 C 代码。谢天谢地——与 C 相比,TCL 实在是太痛苦了!

标签: point-of-sale verifone


【解决方案1】:

我对你的问题有点困惑。 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 并处理不正确的情况。

初始化

首先你必须初始化终端调制解调器接口:

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

拨号

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) )

发送和接收数据

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

从 [hMmodem] 读取,到 [buffer],([1]-忽略),最多 [1] 个字符,在 [1000]“厘秒”(100 分之一秒,即 10 秒)后超时。请注意,totalBytesRead 出错时将为负数。查看文档以了解各种可能的返回值。

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

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

关闭

close(hModem);

返回到 VMAC

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

【讨论】:

  • 我们在哪里可以写我们的目的地号码(电话号码)?通过哪个命令可以更改数字?
  • 在上面的 DIAL 示例中,xmdm_get_line_dial(hModem, dial_string, &amp;iWrite, hClock, 30);dial_string 是电话号码。它还可能包含诸如拨打外线(如 9)的拨号前缀和/或表示暂停的逗号 (,) 等内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-06
  • 2015-08-09
  • 2016-04-08
  • 2016-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多