0

我正在使用 Microsoft Visual Studio 2013 专业 C# 编写程序。我使用了调试器,查看了名为 Message3 的数组,它有正确的信息,但是当它到达连接的计算机 modbus 程序时,消息是不同的。所以我使用了 Wireshark,wireshark 同意 Modbus 程序。这很奇怪,因为它只对某些值(例如 modbus 中的值 7600)执行此操作,它在两个寄存器中发送,分别为 29 和 176,我的程序在数组中有它,但wireshark 看到的是 29 194 176。它以某种方式添加了一个 194不在我的数组中。

        [0] 0 '\0'  char
    [1] 4 ''   char
    [2] 0 '\0'  char
    [3] 0 '\0'  char
    [4] 0 '\0'  char
    [5] 5 ''   char
    [6] 1 ''   char
    [7] 3 ''   char
    [8] 2 ''   char
    [9] 29 ''  char
    [10]    176 '°' char

这就是我的调试器所拥有的,这就是线鲨所看到的:0 4 0 0 0 6 1 3 0 5 0 1 03 02 1d c2 b0

我都试过了: writer.Flush 和 writer.FlushAsync 但没有任何帮助。同样,它也只是一些值。这是我的代码:

 void Listener_function()
    {
        IPHostEntry host;
        string localIP = "?";
        host = Dns.GetHostEntry(Dns.GetHostName());

        listener = null;
        try
        {
            listener = new TcpListener(IPAddress.Parse(Moxa_IPtxt.Text), Convert.ToInt16(modemPorttxt.Text));
            listener.Start();
            // ErrorBox.Text = " EchoServer started ... /n";
            connect_flag = true;
            MessageBox.Show(" waiting for incoming client connections.../n /r");
            client = listener.AcceptTcpClient();
            MessageBox.Show(" Accepted new client coneection ...");

            StreamReader reader = new StreamReader(client.GetStream());
            StreamWriter writer = new StreamWriter(client.GetStream());

            while (true)
            {

                string s = string.Empty;
                char[] temp = new char[12];
                int s1 = reader.Read(temp, 0, 12);
                int Registers_number = (((int)temp[10] << 8) + (int)temp[11]);
                int Message_Size = (Registers_number * 2) + 9;
                char[] Message3 = new char[Message_Size];
                TCPProcessing(temp, Message3);
                if (writeData == true)
                {
                    writer.Write(Message3);
                   // writer.Flush();
                    writer.FlushAsync();
                }

            }
        }
        catch (Exception e)
        {
            MessageBox.Show(e.ToString());
            //button1.Text = "Connect";

            //ErrorBox.Text = e.ToString();
        }
        finally
        {
            if (listener != null)
            {
                listener.Stop();
            }

        }
    }

有任何想法吗 ?

在 FlushAsync 之后我再次在 } 处有一个断点,我复制了有什么消息但它没有 194(请参见上文)

4

1 回答 1

0

布兰登,你似乎没有仔细阅读我写的东西。

不要使用用于文本操作的 StreamReader/StreamWriter。直接使用client.GetStream

这是一个向您展示的代码

var m = new MemoryStream();
var wr = new StreamWriter(m);
wr.Write(new char[] { (char)29, (char)176 }, 0, 2);
wr.Flush();
var bytes2 = m.ToArray();

bytes2的内容是:29,194,176,如您的情况。所以我再说一遍,使用client.GetStream,而不是StreamReader/StreamWriter

于 2017-09-28T16:47:34.087 回答