gpt4 book ai didi

c# - Moneris 半集成解决方案不工作

转载 作者:太空宇宙 更新时间:2023-11-03 22:32:19 24 4
gpt4 key购买 nike

此时我非常沮丧,我想我会把它作为最后的手段发布。

我正在开发一个 C# .NET 4.5 应用程序,它将通过 USB 与 Moneris 支付设备进行通信。它是 Moneris ICT-250,Moneris 将其称为“半集成”应用程序。我一直在尝试发送测试付款以使设备使用串行端口类工作,但似乎没有任何效果。

对于初学者来说,Moneris 确实提供了一个模拟器来启动和运行。我可以确认我可以继续,设置测试付款 - 比如 100.00 美元 - 将其发送出去......然后设备亮起。它还会输出请求和响应的详细日志。

每个请求都必须是一个特定格式的字符串,用于标识支付类型、金额等……我已经采用了在日志中找到的字符串并将其发送出去,但似乎没有任何效果。设备未注册失败或成功。

我知道设备已正确连接。如果我更改端口号或拔下设备,我的 catch 将处理它(如下)。

下面是一个简单的控制台应用程序。我的代码有问题吗?有没有其他人有连接到半集成 Moneris 解决方案的经验?我愿意接受任何想法。 Moneris 无法提供任何支持或代码片段。至少可以说非常令人沮丧......

谢谢大家!代码如下:)

using System;
using System.IO.Ports;

class Moneris_Integration
{
public static void Main()
{
SerialPort port = new SerialPort("COM8");

// These properties are required by the device
port.BaudRate = 19200;
port.Parity = Parity.Even;
port.StopBits = StopBits.One;
port.DataBits = 8;

port.Open();

// This is the request that is sent by the simulator to the device
port.Write("<STX>02<FS>0011000<FS>0020<ETX><LRC>");

port.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

Console.WriteLine("===| Moneris Test |===");
Console.ReadKey();
}

private static void DataReceivedHandler(
object sender,
SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string incomingData = sp.ReadExisting();
Console.WriteLine("Response:");
Console.Write(incomingData);
}
}

最佳答案

根据 somebody else 的建议根据您的问题的评论,它肯定看起来像您正在写给端口的内容:

port.Write("<STX>02<FS>0011000<FS>0020<ETX><LRC>");

需要完全转换为 ASCII。

首先,定义 ASCII control characters :

private byte[] STX = new byte[] { 0x02 };
private byte[] EXT = new byte[] { 0x03 };
private byte[] FS = new byte[] { 0x1C };

您还需要一个函数来计算 LRC,它基于消息的其余部分。我拍了this one :

public static byte calculateLRC(byte[] bytes)
{
byte LRC = 0;
for (int i = 0; i < bytes.Length; i++)
{
LRC ^= bytes[i];
}
return LRC;
}

然后使用 ASCII 编码将消息上的数字字符串转换为字节:

byte[] bytes1 = System.Text.Encoding.ASCII.GetBytes("02");
byte[] bytes2 = System.Text.Encoding.ASCII.GetBytes("0011000");
byte[] bytes3 = System.Text.Encoding.ASCII.GetBytes("0011000");

我们创建一个新的内存块来存储消息:

var message = new MemoryStream();

将我们要发送的字节以 block 的形式附加到我们的消息中:

message.Write(STX, 0 , 1);
message.Write(bytes1, 0, bytes1.Length);
message.Write(FS, 0 , 1);
message.Write(bytes2, 0, bytes2.Length);
message.Write(FS, 0 , 1);
message.Write(bytes3, 0, bytes3.Length);
message.Write(EXT, 0 , 1);

计算LRC:

var LRC_msg = calculateLRC(message)

将其附加到消息中:

message.Write(LRC_msg, 0, LRC_msg.Length);

最后,将其写入端口:

port.Write(message, 0, message.Length);

您还应该考虑到您看到的日志可能会误导您消息的数字部分。如果您仍然没有得到答案,可能是时候查看端口上的真实数据了。为此,您可以打开类似 Termite 的终端。或 RealTerm .我不确定你提到的模拟器是如何工作的,但我假设它是软件,它需要一个串行端口来连接以发送数据。如果是这种情况,您可以按照我的解释尝试转发计算机上的两个真实或虚拟串行端口 here .

它也是suggested您可能需要使用 CR 或 LF 终止您的命令。

关于c# - Moneris 半集成解决方案不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56876799/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com