无法从后台运行的进程中读取STDOut

时间:2018-08-03 09:32:40

标签: c# linux process bluetooth .net-core

因此,在Linux下,我必须通过命令rfcomm connect hci0 xx:xx:xx:xx:xx:xx连接到蓝牙设备,该命令会启动蓝牙连接,但必须保持运行状态才能保持连接状态。

我必须将所有内容编写为.NET Core程序

运行命令几秒钟后输出以下行: Connected /dev/rfcomm0 to xx:xx:xx:xx:xx:xx on channel 1 Press CTRL-C for hangup

从该输出中,我必须获得/dev/rfcomm0部分,因此我可以使用SerialPortReader进行读取,如果出现问题,例如,没有更多数据输入,我有终止进程并重新开始,直到我建立良好的连接为止。

现在我的逻辑是这样的:

while(!Terminate)
{
   string port = Connect();
   ReadData(port);
   BTProcess.Kill();
}

不要担心ReadData(port);函数,因为我的程序永远都不会靠近它。

Connect()看起来像这样:

while (!Connected)
{
    Console.WriteLine("Configuring Process");
    BTProcess = new Process();
    BTProcess.StartInfo.FileName = "rfcomm";
    BTProcess.StartInfo.Arguments = "connect hci0 xx:xx:xx:xx:xx:xx"
    BTProcess.StartInfo.RedirectStandardOutput = true;
    BTProcess.StartInfo.UseShellExecute = false;

    Console.WriteLine("Starting Process");
    BTProcess.Start();

    StreamReader reader = _BTProcess.StandardOutput;

    bool done = false;
    Console.WriteLine("Reading STDOUT now.");
    while (!done) // EDIT: If I do the while with !reader.EndOfStream then it won't even enter into the loop
    {
        Console.Write("-");
        int c = reader.Read(); // Program stops in this line

        if(c != -1)
        {
            port += (char)c;
        }

        Console.Write(c);
        if (c == 0)
        {
            port = "";
            done = true;
            _BTProcess.Kill();
        }
        if (/* String Contains Logic blabla */)
        {
            port = /* The /dev/rfcomm0 stuff */
            Connected = true;
            done = true;
        }
    }
    reader.Close();
}
return port;

我确实已经检查了输出是否没有重定向到类似STDErr之类的东西,但是没有,它是100%用STDOut编写的。

我已经尝试过使用像处理StandardOutput事件的EventHandler这样的逻辑,以及我异步读取它的逻辑,但是都没有成功。它们都有相同的问题,它们都阻塞在Read();函数中。我的猜测是内部缓冲区可能没有正确刷新。

也许有人知道我的问题的答案。 P.S .:我知道我的代码不是最佳或最优化的,但是它仍然可以工作,因为我已经在Windows下用另一个阻止命令尝试过了,并且可以工作。

在此先感谢您提供的所有帮助。

1 个答案:

答案 0 :(得分:0)

我已经解决了该问题,方法是不直接运行命令,因为这会引发缓冲区问题,所以我现在不运行命令rfcomm connect hci0 xx:xx:xx:xx:xx:xx,而是运行stdbuf -o0 rfcomm connect hci0 xx:xx:xx:xx:xx:xx以避免缓冲问题。