我开发了一个从秤中读取数据的项目。 我可以阅读比例发送给我的数据;但是,收到的数据集并不方便。规模品牌是Desis。
示例输出如下。
Output:
T,GS 17.27 g
ST,GS 17.27 g
T,GS 17.27 g
T,GS 17.27 g
27 g
ST,GS 17.27 g
ST,GS 17.27 g
ST,GS 17.27 g
ST,GS 17.27 g
ST,GS 17.27 g
ST,GS 17.27 g
30.89 g
ST,GS 17.27 g
ST,GS 17.27 g
ST,GS 17.27 g
ST,GS 17.27 g
收到的数据必须是ST,GS连续17.27克。
我的书面代码:
public void Connect()
{
m_tcpClient = new TcpClient();
m_tcpClient.Connect(m_hostAdress, m_port);
}
public string ReadWithNewLine()
{
this.Connect();
m_netWorkStream = m_tcpClient.GetStream();
m_streamReader = new StreamReader(m_netWorkStream);
if (m_streamReader != null)
{
try
{
m_readText = m_streamReader.ReadLine().TrimEnd();
}
catch (Exception ex)
{
}
}
return m_readText + "\r\n";
}
代码中是否有错误?
答案 0 :(得分:0)
我认为您的代码中没有任何错误。但我认为你一次只读一行。如果您想要阅读所有行,那么您可以使用
m_readText = m_streamReader.ReadToEnd().TrimEnd();
但是如果你想逐行阅读并按照你的问题获取数据,那么我认为发件人正按照该顺序发送数据。
答案 1 :(得分:0)
您正在ReadWithNewLine
的每次通话中重新创建TcpClient。如果你这样做,另一端的TcpServer必须关闭旧连接并启动一个新连接,协商连接,每次都会丢失几个字节。
尽可能接近您当前的设计我建议您尝试使用以下更改进行设置:
public void Connect()
{
if (m_tcpClient == null)
{
m_tcpClient = new TcpClient();
m_tcpClient.Connect(m_hostAdress, m_port);
m_netWorkStream = m_tcpClient.GetStream();
m_streamReader = new StreamReader(m_netWorkStream);
}
}
public string ReadWithNewLine()
{
this.Connect();
try
{
m_readText = m_streamReader.ReadLine().TrimEnd();
}
catch (Exception allExceptions)
{
m_readText = "Exception:" + allExceptions.Message;
if (m_tcpClient!=null)
{
m_tcpClient.Close();
m_tcpClient = null; // reset connection
}
}
return m_readText + "\r\n";
}
注意我如何检查Connect
方法,验证TcpClient
是否已存在实例。如果没有,我创建一个并建立流和阅读器。
第一次拨打ReadWithNewLine
时,它会拨打Connect
并设置与您的比例的连接。在下一次调用时,Connect将不执行任何操作并重新使用现有读取器来获取字节。
我也略微改变了你的异常处理。我能做的最少的是提供一些反馈并重置TcpClient。您可能希望进一步增强它,以便仅捕获那里发生的特定异常。
答案 2 :(得分:0)
您可以使用大量方法从TCPClient检索响应数据。我使用流动代码来格式化输出。
private int TCPTimeOut = 10000;
private int NetStreamTimeOut = 10000;
private string ipAddress = "";
private int port;
private int intThreadSleep;
private bool disposed = false;
private TcpClient tcpClient = new TcpClient();
private void GetTCPData()
{
tcpClient.Connect(ipAddress, port);
tcpClient.ReceiveTimeout = TCPTimeOut;
NetworkStream stream = tcpClient.GetStream();
stream.ReadTimeout = NetStreamTimeOut;
Byte[] data = new Byte[5210];
string responseData = String.Empty;
while (true)
{
Int32 bytes = stream.Read(data, 0, data.Length);
System.Threading.Thread.Sleep(intThreadSleep);
responseData = responseData + System.Text.Encoding.ASCII.GetString(data, 0, bytes);
if (bytes > 10)
{
var table = responseData.Split(new string[] { "\r\n", "\r", "\n" },
StringSplitOptions.None);
if (table.Count() > 3)
{
string line1 = table[0];
string line2 = table[1];
string line3 = table[2];
string line4 = table[3];
string line5 = table[4];
string line6 = table[5];
// SaveData(ipAddress, line1, line2, line3, line4, line5, line6);
}
}
responseData = String.Empty;
}
if (tcpClient != null)
{
tcpClient.GetStream().Close();
tcpClient.Close();
}
}