2014-02-19 46 views
1

所以我特別想要做的是獲得一個串行代理將管道arduino到Unity3d在Linux上運行。 System.IO.Ports不能在具有統一性的linux上工作。無法弄清楚如何讓Socket接收數據C#

所以我得到了一個基於python的串口代理腳本,我已經啓動並運行得很好。我可以netcat進入本地主機,實際上從arduino獲得輸出。

nc localhost 8082 
g'day from bitty 1.0 -- type 'logout' to disconnect 
Connecting to /dev/tty.usbmodem5d11... connected. 
HELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLO 

我只有arduino打印出HELLO重複。

但是,串行代理已啓動並正在運行,並且有數據通過它。

現在我正在嘗試在Unity中編寫代碼來接收這些數據,但我無法使其工作。

這是我的代碼:

public Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); 
public byte[] buffer = new byte[256]; 

int pinRead = 0; 

void Start() 
{ 
    socket.Connect(IPAddress.Parse("127.0.0.1"),8082); 

} 

void Update() 
{ 
    if (socket.IsBound) 
    { 
     try 
     { 
      int bytesRead; 
      bytesRead = socket.Receive(buffer); 
      string incommingdata = System.Text.Encoding.ASCII.GetString(buffer); 
      Debug.Log(bytesRead+" || "+incommingdata); 

     } 
     catch (System.Exception e) 
     { 


     } 
    } 

bytesRead始終爲0和incomingData只是沒有任何關係。它連接,isBound返回true。我無法讓代碼正確地接收數據並將其放入可用的格式中。

請幫忙。我需要得到這個工作,遠遠超出我的專業領域。我如何完成這項工作?

回答

0

(對不起,我不能發表評論或會這樣做那裏)

BytesRead = 0通常意味着斷開遠程端。

當我運行測試TCP服務器偵聽端口8082上的連接併發送一些文本消息時,代碼工作正常。所以我懷疑問題是在C#客戶端。

除了這個簡單的例子,「讓這個工作」並不一定是一個簡單的問題。這裏有一些事情你應該記住:

  • 你其實是在阻止接收呼叫,這意味着你將需要調用Update在一個循環。

  • TCP是一種流媒體協議,因此您可能會在同一個Read調用中將部分消息或許多消息捆綁在一起。查看「TCP Framing」以獲得更多細節。

+0

在Unity中,更新功能是主遊戲循環,它以60 fps的速度調用。 此外,服務器沒有斷開連接,因爲我有它在那裏終端運行,它說我的C#代碼連接。 – rygo6

+0

我想你的原始代碼的問題是它試圖從不同的線程同時進行多次阻塞的接收調用。 Unity是異步調用更新還是單線程? (對不起,我不得不在這裏發表評論,而不是在你的回答中)。 –

0

您可以嘗試在此套接字上使用telnet,以查看是否可以連接到它。

的telnet 127.0.0.1 8082

+0

是的,它確實顯示來自本地主機服務器的信息。 netcat展示的是同樣的東西。 – rygo6

0

所以我得到了這個它利用tcpclient對象和被張貼在一個隨機團結博客的代碼片段一些工作....

這如果有人想看。我仍然很想知道如何獲得Socket實現的功能。

using UnityEngine; 
using System.Collections; 
using System.Net; 
using System.Net.Sockets; 
using System; 
using System.Text; 
using System.IO; 
using System.Threading; 

public class ArduinoTest : MonoBehaviour 
{ 
    private bool socketReady = false; 
    private TcpClient mySocket; 
    private NetworkStream theStream; 
    private StreamWriter theWriter; 
    private StreamReader theReader; 
    private string Host = "localhost"; 
    private Int32 Port = 9900; 
    private int pinRead = 0; 


    void Start() 
    { 
     setupSocket(); 
    } 

    void Update() 
    { 
     string read = readSocket(); 
     if (read != "") 
     { 
      int value = int.Parse(read); 
      if (value > 53) 
      { 
       Debug.Log((value-54)+" DOWN"); 
      } 
      else 
      { 
       Debug.Log(value+" UP"); 
      } 
     } 
    } 

    void OnApplicationQuit() 
    { 
     writeSocket("logout"); 
     closeSocket(); 
    } 

    public void setupSocket() 
    { 
     try 
     { 
      mySocket = new TcpClient(Host, Port); 
      theStream = mySocket.GetStream(); 
      theWriter = new StreamWriter(theStream); 
      theReader = new StreamReader(theStream); 
      socketReady = true; 
     } 
     catch (Exception e) 
     { 
      Debug.Log("Socket error:" + e); 
     } 
    } 

    public void writeSocket(string theLine) 
    { 
     if (!socketReady) 
      return; 
     String tmpString = theLine + "\r\n"; 
     theWriter.Write(tmpString); 
     theWriter.Flush(); 
    } 

    public string readSocket() 
    { 
     if (!socketReady) 
      return ""; 
     if (theStream.DataAvailable) 
      return theReader.Read().ToString(); 
     return ""; 
    } 

    public void closeSocket() 
    { 
     if (!socketReady) 
      return; 
     theWriter.Close(); 
     theReader.Close(); 
     mySocket.Close(); 
     socketReady = false; 
    } 

    public void maintainConnection() 
    { 
     if(!theStream.CanRead) 
     { 
      setupSocket(); 
     } 
    } 

}