Process.Start()仅在线路被误读时起作用

时间:2015-07-08 15:30:23

标签: c# process.start

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

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

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

例如:

  

收到的数据:
  ç
  收到的数据:
  ç
  收到的数据:
  ç

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

  

收到的数据:
  收到的cData:
  收到的数据:
  ç

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

我要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.
        }
    }
}

作为奖励,我需要找一个程序员来帮助我实现我在StackOverflow上找到的面部检测/裁剪程序。实际上发现一个用python编写,另一个用C#编写。一直在网站上聘请程序员,但这些优惠看起来很大胆,没有任何承诺。无论如何,如果你需要更多信息,请告诉我。

1 个答案:

答案 0 :(得分:0)

It looks like your sender not only sends the 'c' character but also some whitespace. So basically you just need to relax the condition in your if statement a bit.

So instead of

if (indata == "c")

please try for example

if (indata.Contains("c"))