Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MICROS 8700返回的固定消息格式未记录_C#_Pos - Fatal编程技术网

C# MICROS 8700返回的固定消息格式未记录

C# MICROS 8700返回的固定消息格式未记录,c#,pos,C#,Pos,我正在研究POS通过串行com端口发送MICROS 8700固定消息和我们的PMS之间的接口。 我的经验是C#、MVC、AJAX、webapp端和更现代的技术。我对所有的COM串口通信和Micros仿真都很迷茫,但我已经尽了我所能 我创建了一个C#windows服务,它接收消息并(从我看到的)返回消息。 POS软件通过串行COM端口发送其消息。 我在中间有第三方软件将它转换成TCP(我可以看到从POS传递到第三方软件上的POS)。 我的软件正在侦听特定的TCP端口 它很好地接收字节流 转换为AS

我正在研究POS通过串行com端口发送MICROS 8700固定消息和我们的PMS之间的接口。 我的经验是C#、MVC、AJAX、webapp端和更现代的技术。我对所有的COM串口通信和Micros仿真都很迷茫,但我已经尽了我所能

我创建了一个C#windows服务,它接收消息并(从我看到的)返回消息。 POS软件通过串行COM端口发送其消息。 我在中间有第三方软件将它转换成TCP(我可以看到从POS传递到第三方软件上的POS)。 我的软件正在侦听特定的TCP端口

它很好地接收字节流

转换为ASCII字符串

校验和是基于响应字符串创建的,但不包括SOH,最多包括ETX字符

使用ASCII编码将响应转换为字节数组

它的回复是,我认为是正确的格式,但POS软件没有记录它

我一直在研究我的校验和计算不正确的理论,但在改变校验和的确定方式时,我没有取得任何进展

我以SOH(\u0001)字符开头每条消息,以EOT(\u0004)结尾。我还使用STX(\u0002)和ETX(\u0003)分隔消息

我甚至无法记录基本的错误消息

为了让我看起来不懒惰/不称职,我所要做的就是从一个示例日志文件和我可以在互联网上找到的内容

我想我需要“1000/2000/4700/8700 pms接口规范手册”,但我找不到副本

我的程序接收消息

1 REV 1 120 2001069B

那是

SOH 1Rev 1 STX 1 120 2001ETX069BEOT

我的程序以

1Rev 1/无效条目0AC5

那是

SOH 1Rev 1 STX 1/无效输入ETX0AC5EOT

SOH终端ID STX 1/无效输入ETXchecksumEOT

有时,当连接从POS端超时时,每隔30秒,回复的第一个字符就会出现在POS日志中,但我相信这与缓冲区有关

可能我发送了一些非常错误的信息,POS软件没有得到预期的结果,因此它没有记录/处理这些信息

我正在发送EOT,我相信它会告诉POS消息已完成,windows服务也会关闭流。所以我不认为POS正在等待消息的结束

我读过一些可能有用的帖子

真的,我想要一些关于如何生成校验和的建议,或者关于我的问题可能是什么的任何其他建议。 请查看我尝试过的两个不同的校验和代码块

从 校验和是所有数据的16位二进制加法(不包括奇偶校验,如果适用) SOH后的字符,最多包括ETX字符。校验和为 最初设置为零。对于传输,校验和表示为四个ASCII十六进制 人物。”

私有静态字符串GetChecksum(字符串s)
{
整数校验和=0;
byte[]binary=Encoding.ASCII.GetBytes;
foreach(二进制字节b)
{
校验和=((校验和+b)和0xFF);
}
校验和=((校验和^0xFF)+1)和0xFF);
返回校验和ToString(“X4”);
}
私有静态字符串GetChecksum(字符串数据)
{
短校验和=0;
int字节数=data.Length;
int指数=0;
炭流;
字节intOffset=48;
字节alphaOffset=55;
字节刻度=16;
if(字节数<2)//坏字符串
返回“错误”;
while(索引<字节计数-1)
{
当前=数据[index++];
如果(当前<‘A’)
{
校验和+=(字节)((字节)当前-输入偏移)*刻度;
}
其他的
{
校验和+=(字节)((字节)当前-字母偏移)*16);
}
当前=数据[index++];
如果(当前<‘A’)
{
校验和+=(字节)((字节)当前-输入偏移);
}
其他的
{
校验和+=(字节)((字节)当前-字母偏移量);
}
索引++;
}
返回校验和ToString(“X4”);
}

结果表明,在回复邮件之前,我需要先回复ACK

十进制八进制十六进制二进制字符

006 006 0x06 00000110确认(确认)

还是C#

并按如下方式计算校验和

现在我的回答被软件验证并显示出来

ASCII字符,表示校验和。有 始终是4个数字。它们是十六进制(0到9是 由十六进制0x30..0x39表示,A-F由 十六进制0x41到0x46)。校验和由 将其设置为0,然后从 包括(但不包括)和通过(包括) 字符。然后表示结果数字 使用ASCII字符并放置在消息中 "

我希望这能帮助那些一直致力于旧技术的人

        private static string GetChecksum(string s)
    {
        int checksum = 0;

        byte[] binary = Encoding.ASCII.GetBytes(s);

        foreach (byte b in binary)
        {
            checksum = ((checksum + b) & 0xFF);
        }
        checksum = (((checksum ^ 0xFF) + 1) & 0xFF);
        return checksum.ToString("X4");
    }

 private static string GetChecksum(string data)
    {
        short checksum = 0;
        int byteCount = data.Length;
        int index = 0;
        char current;
        byte intOffset = 48;
        byte alphaOffset = 55;
        byte scale = 16;

        if (byteCount < 2) // bad string
            return "Error";

        while (index < byteCount - 1)
        {
            current = data[index++];
            if (current < 'A')
            {
                checksum += (byte)(((byte)current - intOffset) * scale);
            }
            else
            {
                checksum += (byte)(((byte)current - alphaOffset) * 16);
            }
            current = data[index++];
            if (current < 'A')
            {
                checksum += (byte)(((byte)current - intOffset));
            }
            else
            {
                checksum += (byte)(((byte)current - alphaOffset));
            }
            index++;
        }
        return checksum.ToString("X4");
    }
static char ACK = '\u0006';


byte[] ackMsg = System.Text.Encoding.ASCII.GetBytes(ACK.ToString());
                            stream.Write(ackMsg, 0, ackMsg.Length);
 private static string GetChecksum(string s)
        {//this gives matching checksums
            int checksum = 0;

            byte[] binary = Encoding.ASCII.GetBytes(s);

            foreach (byte b in binary)
            {
                checksum = ((checksum + b));
            }
            return checksum.ToString("X4");
        }