Process.Start() 仅在行被误读时有效

Process.Start() only works when line is misread

我有一个 Arduino 通过 COM 端口 3 发送一个字符 'c'
我有一个 VS2013 C# 控制台应用程序在 COM3 上侦听字符 'c'if 语句在读取 'c' 时启动一个 .ahk 文件。

问题是,当我在另一台计算机上构建和安装我的应用程序时,只有在控制台上的行写入错误时才会打开该文件。

经过几次尝试,我注意到了这一点。也就是说,当接收到数据时,控制台会打印一个新行 "data received",并在第二行打印数据。

例如:

Data received:
c
Data received:
c
Data received:
c

现在这不会启动它应该启动的应用程序。但这将:

Data received:
cData received:
Data received:
c

请注意,在这两个示例中,我都收到了三次数据,但仅在第二个示例中,行未正确解析,并且不打印字符,或者有换行符。在它收到数据的三次中的一次。奇怪的是,当它启动应用程序时。

我要收取 2 美元打印照片。每 2 美元都会触发一个 ahk 脚本,该脚本会获取并打印图像。因此,每次插入 2 美元时,我都会收到一个“c”。然后,在打印图像后,ahk 脚本退出,我希望在插入另外 2 美元后再次重新打开它。

I have read about Process.Start() in Microsoft pages. I'm still learning basics so it takes me a while to think in the right direction.

我花了几个小时试图通过反复试验弄清楚。在我有限的能力允许的范围内对代码进行修改。 link to an example on how to call a process from C#.

无论如何,这是我(顺便说一下)从 Microsoft 帮助站点上的 Google 搜索复制粘贴的代码:

using System;
using System.IO.Ports;
using System.Diagnostics;
using System.Threading;

class PortDataReceived
{
    public static void Main()
    {
        SerialPort mySerialPort = new SerialPort("COM3");

        mySerialPort.BaudRate = 9600;
        mySerialPort.Parity = Parity.None;
        mySerialPort.StopBits = StopBits.One;
        mySerialPort.DataBits = 8;
        mySerialPort.Handshake = Handshake.None;
        mySerialPort.RtsEnable = true;

        mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

        mySerialPort.Open();

        Console.WriteLine("Press any key to continue...");
        Console.WriteLine();
        Console.ReadKey();
        mySerialPort.Close();
    }

    private static void DataReceivedHandler(
                        object sender,
                        SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;
        string indata = sp.ReadExisting();
        Console.WriteLine("Data Received:");
        Thread.Sleep(300);
        Console.Write(indata);
        Thread.Sleep(300);
        if (indata == "c")
        {
            Thread.Sleep(1000);
            //Process.Start(@"C:\Users\laptop\Desktop\print.ahk");
            Process process = new Process();
            // Configure the process using the StartInfo properties.
            process.StartInfo.FileName = "print.ahk";
            process.StartInfo.Arguments = "-n";
           //process.StartInfo.WindowStyle = ProcessWindowStyle.Maximized;
            process.Start();
            process.WaitForExit();// Waits here for the process to exit.
        }
    }
}

作为奖励,我需要找到一个程序员来帮助我实现我在 Whosebug 上找到的面部 detection/crop 程序。实际上找到了一个用 python 和另一个用 C# 编写的。一直在在线网站上招聘程序员,但提议似乎很大胆,而且没有任何承诺。如果您需要更多信息,请随时联系我。

看起来您的发件人不仅发送了 'c' 字符,还发送了一些空格。所以基本上你只需要稍微放宽 if 语句中的条件。

所以

if (indata == "c")

例如请尝试

if (indata.Contains("c"))