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 美元后再次重新打开它。
我花了几个小时试图通过反复试验弄清楚。在我有限的能力允许的范围内对代码进行修改。 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"))
我有一个 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 美元后再次重新打开它。
我花了几个小时试图通过反复试验弄清楚。在我有限的能力允许的范围内对代码进行修改。 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"))