为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
慕田峪9158850 2021-11-14 14:39:32
因此,在 Linux 下,我必须通过命令连接到蓝牙设备,该命令rfcomm connect hci0 xx:xx:xx:xx:xx:xx启动蓝牙连接,但必须保持运行才能保持连接。我必须将所有内容都编写为 .NET Core 程序几秒钟后运行该命令会输出以下几行: Connected /dev/rfcomm0 to xx:xx:xx:xx:xx:xx on channel 1Press 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 编写的。我已经尝试过类似处理标准输出事件的 EventHandler 的逻辑,以及我异步读取它的逻辑,但都没有成功。所有人都有同样的问题,他们都阻塞在Read();函数上。我的猜测是内部缓冲区可能没有正确刷新。也许这里有人知道我的问题的答案。PS:我知道我的代码不是最好的或最优化的,但它应该可以工作,因为我已经在 Windows 下使用另一个阻塞命令尝试过它并且它工作正常。预先感谢我得到的每一个帮助。
查看完整描述

1 回答

?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

我通过简单地不直接运行命令解决了这个问题,因为这会引发缓冲区问题,所以我现在不运行命令rfcomm connect hci0 xx:xx:xx:xx:xx:xx,而是运行stdbuf -o0 rfcomm connect hci0 xx:xx:xx:xx:xx:xx,以避免缓冲问题。


查看完整回答
反对 回复 2021-11-14
  • 1 回答
  • 0 关注
  • 137 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信