我有一个Arduino通过COM端口3发送一个字符'c'
我有一个VS2013 C#控制台应用程序在COM3上侦听角色'c'
。
读取if
时的'c'
语句将启动.ahk文件。
问题是,当我在另一台计算机上构建并安装我的应用程序时,只有在控制台上错误地写入该行时才会打开该文件。
经过多次尝试,我注意到了这一点。也就是说,当收到数据时,控制台会打印一个新行"data received"
,并打印第二行数据。
例如:
收到的数据:
ç
收到的数据:
ç
收到的数据:
ç
现在这不会启动它应该的应用程序。但这会:
收到的数据:
收到的cData:
收到的数据:
ç
请注意,在这两个示例中,我已经收到了三次数据,但仅在第二个示例中,行未正确解析且不打印字符,或者也有换行符。在三次收到数据之一。奇怪的是,当它启动应用程序时。
我要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.
}
}
}
作为奖励,我需要找一个程序员来帮助我实现我在StackOverflow上找到的面部检测/裁剪程序。实际上发现一个用python编写,另一个用C#编写。一直在网站上聘请程序员,但这些优惠看起来很大胆,没有任何承诺。无论如何,如果你需要更多信息,请告诉我。
答案 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"))