0

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

h_modem = open(DEV_COM3 , 0);
4

1 回答 1

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 并处理它不是的情况。

初始化

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

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);
于 2015-08-27T20:01:19.820 回答