我想在verifone vx520上使用调制解调器rs-232(COM3)发送数据。如何初始化它以及如何包含它的库?我如何拨打verifone vx520?
h_modem = open(DEV_COM3 , 0);
答案 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);