2017-08-31 74 views
2

調試代碼一步當我在socket編程新手預期。我有一個用C#編寫的小應用程序,它使用COM端口連接到「密鑰映射器」設備,該設備僅在應用程序發送匹配命令時纔會響應。例如:如果我需要從映射器獲取一些PIN碼,我發送了一個十六進制命令。然後我收到正確的回覆。現在我正在嘗試使用套接字連接和設備的唯一IP地址執行相同的活動,如下所示。Socket.Receive()的作品,因爲只有一步

private void button1_Click(object sender, EventArgs e) 
{ 
    byte[] sendCommand = new byte[] { 0x02, 0x24, 0x31, 0x95, 0x0A, 0x0D, 0x03 }; 
    byte[] ReceivedVal = new byte[1024]; 
    IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse("192.168.178.170"), 10001); 
    Socket senderNew = new Socket(AddressFamily.InterNetwork, 
            SocketType.Stream, ProtocolType.Tcp); 

    waitLoop(5); 
    try 
    { 
     senderNew.Connect(ipEndPoint); 
    } 
    catch(SocketException socProblem) 
    { 
     Console.WriteLine(socProblem.Message.ToString()); 
    } 
    waitLoop(5); 
    int test = senderNew.Receive(ReceivedVal); 
    Console.Write("Starting bytes read : "); 
    Console.WriteLine(test.ToString()); 
    waitLoop(5); 

    int bytesSent = senderNew.Send(sendCommand); 
    waitLoop(5); 
    Console.WriteLine("Socket connected to {0}", senderNew.RemoteEndPoint.ToString()); 
    int bytesRec = senderNew.Receive(ReceivedVal); 
    Console.Write("data bytes read : "); 
    Console.WriteLine(bytesRec.ToString()); 
    waitLoop(5); 

    QueryAllCodeResponseHandler(ReceivedVal); 
    waitLoop(5); 
    Console.Write("Number of Pin Codes read: "); 
    Console.WriteLine(PinCodes.Length.ToString()); 
    senderNew.Close(); 
    GC.Collect(); 
    PinCodes = null; 
    ReceivedVal = null; 
    ipEndPoint = null; 
    GC.Collect(); 
} 

預期結果如下:

enter image description here

當我調試它一行行,它的工作原理完全沒問題。但是如果我直接運行它而沒有任何調試點或者跳過逐行調試,我只能得到2個引腳或0個引腳。然後,我試圖在嘗試失敗後使用第三方應用程序寫入,並意識到它從前一次嘗試中收到其餘引腳。有人能幫我發現問題在哪裏嗎?

+0

你爲什麼這樣做:'的byte [] ReceivedVal =新的字節[1024]'? ''byte [] ReceivedVal = new byte [12];''''''''''''''''''''''''''''''''''' (https://msdn.microsoft.com/en-us/library/windows/desktop/ms740121(v=vs.85).aspx)函數,它將等待緩衝區(在您的情況下爲「1024字節」)被填充。 –

+0

因爲我收到十進制的結果。根據協議,我不會收到只有引腳,但我需要在解碼過程中刪除一些其他分隔符。這不是我可以使用該設備的唯一命令。 – Isuru

+1

您顯示的代碼中有一堆'Console.WriteLine'。然後顯示您所說的預期輸出是正確的,但它不包含任何代碼寫入控制檯的字符串。在代碼中,你*顯示的輸出是在哪裏產生的,這完全不清楚。沒有其他人可以告訴你沒有顯示的代碼中發生了什麼。閱讀[問] –

回答

1

前面已經指出的那樣,你的代碼留下了一些問題,但(假設你的調試步驟是正確的),似乎你只是依靠TCP協議完成後收到您的回覆來決定。

您要連接的設備應該使用應用程序定義的協議來允許查詢它。例如,初始響應將包含整個響應的字節計數,或者它將使用特定的字符來指示響應的結束,有無限的方式。

正確的執行將循環通過多個接收(),直到數據被完全接收(或超時)。

換句話說,該設備似乎發出比你想象的要慢得多數據直餾(無調試站)將正好趕上一個部分反應。

+0

感謝您的提示。我必須在發送和接收之後添加Thread.sleep(300)才能使其工作! – Isuru

相關問題