所以我特别想要的是获得一个串行代理将arduino传输到Unity3d以在linux上运行。 System.IO.Ports只能在linux上使用统一功能。
所以我得到了一个基于python的串行代理脚本,我已经启动并运行得很好。我可以netcat进入localhost,实际上从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 :(得分:0)
(抱歉,我还不能发表评论,或者会在那里发表评论)
BytesRead = 0通常表示远程端已断开连接。
对于它的价值,当我运行测试TCP服务器监听端口8082上的连接并发送一些文本消息时,您的代码工作正常。所以我怀疑问题是在C#客户端。
除了这个简单的例子,“让它发挥作用”并不一定是一个简单的问题。以下是您应该记住的几件事:
您正在阻止接听电话,这意味着您需要在循环中调用更新。
TCP是一种流协议,因此您可能会在同一个Read调用中获得部分消息或许多消息捆绑在一起。查看“TCP Framing”以获取更多详细信息。
答案 1 :(得分:0)
您可以尝试在此套接字上使用telnet,只是为了查看是否可以连接到它。
telnet 127.0.0.1 8082
答案 2 :(得分: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();
}
}
}