C# Moneris半集成解决方案不起作用

C# Moneris半集成解决方案不起作用,c#,serial-port,C#,Serial Port,在这一点上我很沮丧,我想我会把这作为最后的手段 我正在开发一个C#NET 4.5应用程序,它将通过USB与Moneris支付设备进行通信。它是Moneris ICT-250,Moneris将其称为“半集成”应用程序。我一直在试图发送一个测试付款,让设备工作使用串行端口类,但似乎没有任何工作 首先,Moneris确实提供了一个模拟器来启动和运行。我可以确认,我可以继续,设置一个测试付款-比如100.00美元-发送它…和设备亮起。它还输出请求和响应的详细日志 每个请求都必须是一个特定格式的字符串,用

在这一点上我很沮丧,我想我会把这作为最后的手段

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

首先,Moneris确实提供了一个模拟器来启动和运行。我可以确认,我可以继续,设置一个测试付款-比如100.00美元-发送它…和设备亮起。它还输出请求和响应的详细日志

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

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

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

谢谢大家!代码如下:)

使用系统;
使用System.IO.Ports;
类Moneris_集成
{
公共静态void Main()
{
SerialPort端口=新的SerialPort(“COM8”);
//这些属性是设备所必需的
波特率=19200;
端口奇偶性=奇偶性偶数;
port.StopBits=StopBits.One;
port.DataBits=8;
port.Open();
//这是模拟器发送给设备的请求
端口写入(“0200110000020”);
port.DataReceived+=新的SerialDataReceivedHandler(DataReceivedHandler);
Console.WriteLine(“==”Moneris测试“==”;
Console.ReadKey();
}
私有静态无效DataReceivedHandler(
对象发送器,
SerialDataReceivedEventArgs(e)
{
SerialPort sp=(SerialPort)发送方;
字符串incomingData=sp.ReadExisting();
控制台。WriteLine(“响应:”);
控制台。写入(输入数据);
}
}
正如您的问题评论中所建议的,它看起来确实像您正在向端口写入的内容:

port.Write("<STX>02<FS>0011000<FS>0020<ETX><LRC>");
port.Write(message, 0, message.Length);
您还需要一个函数来计算LRC,它基于消息的其余部分。我采取了:

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

var message = new MemoryStream();
message.Write(LRC_msg, 0, LRC_msg.Length);
将要发送到邮件的字节以块的形式追加:

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)
将其附加到消息中:

var message = new MemoryStream();
message.Write(LRC_msg, 0, LRC_msg.Length);
最后,将其写入端口:

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

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


另外,您可能需要使用CR或LF终止命令。

好的-我已经开始工作了。我想在这里发布我的解决方案,以防其他人试图通过他们所谓的“半集成”解决方案与Moneris支付设备通信

每个人的建议都让我思考……因此,经过更多的研究和测试,我能够让设备正常工作

注意:在本例中,发送的十六进制是硬编码的(目前),我已经硬编码了LRC。向前看,需要动态计算十六进制请求+LRC。另外,将数据位设置为7,而不是8

using System;
using System.IO.Ports;

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

        port.BaudRate = 19200;
        port.Parity = Parity.Even;
        port.StopBits = StopBits.One;
        port.DataBits = 7;      // Changed to 7. Was incorrectly told it was 8.

        port.Open();

        // You'll need to change this to be whatever your app is trying to send at the time
        // Last array item is the LRC. In my case, it was 0x31
        var bytesToSend = new byte[] { 0x02, 0x30, 0x30, 0x1c, 0x30, 0x30, 0x31, 0x31, 0x30, 0x30, 0x30, 0x1c, 0x30, 0x30, 0x32, 0x30, 0x03, 0x31 };

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

        port.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

        Console.ReadKey();
    }

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

        }
        return LRC;
    }

    private static void DataReceivedHandler(
    object sender,
    SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;
        string incomingData = sp.ReadExisting();
        Console.WriteLine("Response:");
        Console.Write(incomingData);
    }
}
使用系统;
使用System.IO.Ports;
类Moneris_集成
{
公共静态void Main()
{
SerialPort端口=新的SerialPort(“COM4”);
波特率=19200;
端口奇偶性=奇偶性偶数;
port.StopBits=StopBits.One;
port.DataBits=7;//更改为7。被错误告知为8。
port.Open();
//您需要将此更改为您的应用程序当时试图发送的内容
//最后一个数组项是LRC。在我的例子中,它是0x31
var bytesToSend=新字节[]{0x02、0x30、0x30、0x1c、0x30、0x30、0x31、0x30、0x30、0x30、0x1c、0x30、0x30、0x32、0x30、0x03、0x31};
Write(bytesToSend,0,bytesToSend.Length);
port.DataReceived+=新的SerialDataReceivedHandler(DataReceivedHandler);
Console.ReadKey();
}
公共静态字节计算器(字节[]字节)
{
字节LRC=0;
for(int i=0;i
我不认为
端口。Write(“
做你认为它做的事。如果我没记错的话,是ASCII代码2,你必须自己编码。你可能还需要设置端口使用的(不相关的)代码页编码。这里有这样的示例。如果找不到,请呼叫。设备是否需要“\n“在每个命令的末尾?您正在使用Write,也许您应该使用WriteLine.OK-首先感谢大家的评论。您对ASCII的看法是正确的….I