关于我需要从连接到某些测量设备的 SCPI Lan 获取二进制数据, 首先我尝试使用像这样的
StreamReader
对象:
public async Task<string> Transmit ()
{
IPAddress ipAddress = new IPAddress(new byte[] { 192, 168, 0, 21 });
TcpClient client = new TcpClient();
await client.ConnectAsync(ipAddress, 5555); // Connect
NetworkStream networkStream = client.GetStream();
StreamWriter writer = new StreamWriter(networkStream);
StreamReader reader = new StreamReader(networkStream);
writer.AutoFlush = true;
//SEND Command to Machine
await writer.WriteLineAsync("WAV:READ?" + "\n");
//Receive Data from Machine
string respond= await reader.ReadLineAsync();
return respond;
}
它工作正常,但问题是实际数据以二进制格式发送,正如我发现
StreamReader
无法处理二进制数据,我也尝试更改不同的Unicode,例如UTF8
,并且所有大于127的数据再次更改为65536当我尝试通过以下方式将字符串转换为二进制时:
byte[] RawData = System.Text.Encoding.ASCII.GetBytes(data);
所以我尝试使用不支持
BinaryReader
的asyncRead
,所以我尝试通过检查DataAvailable
对象中的networkSteam
属性来使用轮询方法,如下所示:
//...
while (true)
{
if (networkStream.DataAvailable)
{
byte b = binaryReader.ReadByte();
//.. do grabbing data and find EOP by dispatching data packet
//.. size could varies
//.. if(EOP)
//.. {
//.. break;
//.. }
}
}
但是
networkStream.DataAvailable
永远不会变成 true ,即使不检查 binaryReader.ReadByte()
属性,我也没有机会从 DataAvailable
获取任何字节。
对于我的项目来说,支持
async
方法也很重要,而 binaryReader
似乎不支持;
我的代码在.NetFramework 4.6下运行。
请问有人有什么建议可以帮助我解决我的问题吗?
正如评论中已经指出的:忘记
StreamReader
/StreamWriter
;它们用于文本,而您不是在阅读(纯)文本。您将需要直接使用 Stream
API(特别是 ReadAsync
和 WriteAsync
),并自行处理其余部分;特别是,在阅读时,您通常会使用读缓冲区,并且需要处理尚未使用的数据的后台缓冲区、检测单个块/帧等。处理文本时子数据,Encoding
发挥作用。