2015-07-08 3 views
0

У меня есть Arduino посылает символ 'c' через COM-порт 3.
У меня есть # консольное приложение VS2013 C прослушивает COM3 для персонажа 'c'. Оператор if, когда считывается 'c', запускает файл .ahk.Process.Start() работает только тогда, когда линия неправильно

Проблема заключается в том, что при создании и установке моего приложения на другом компьютере файл будет открыт, только если строка написана неправильно на консоли.

Я заметил это после нескольких попыток. Итак, когда данные получены, консоль печатает новую строку "data received" и вторую строку с данными.

Ex:

Данные, полученные: полученные
с
данных: получено
с
данных:
с

Теперь это не будет запустить приложение как это должно , Но это будет:

Данные, полученные:
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#.

Во всяком случае, вот код, который (кстати) я копия вставленный из поиска Google на сайте справки Microsoft:

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#. Были на сайтах онлайн, чтобы нанимать программистов, но предложения кажутся смелыми и без каких-либо обещаний. В любом случае, когда мне нужна дополнительная информация.

+3

в DataReceivedHandler, вы должны петля на всех персонажей есть в «входных данных,» вы можете получить более одного символа, когда событие срабатывает, даже если вы удалите инструкции Sleep, которые не кажутся полезными. – Graffito

+0

Что вы хотите, чтобы ваша программа выполняла, если она получает более одного символа '' c''? Если вам нужна ваша программа для запуска процесса один раз для каждого символа, вам нужно будет сканировать строку, которая была прочитана из последовательного порта, и запустить процесс для каждого из них. Если вам просто нужно запустить процесс один раз, независимо от того, сколько их отправлено, то с помощью 'Contains()' в качестве ответных состояний будут работать. К сожалению, ваш вопрос слишком расплывчатый, чтобы знать, что такое _right_ ответ. –

+0

@peter Я заказываю 2 доллара для печати фотографий. Каждые 2 доллара запускают сценарий ahk, который берет и печатает изображение. Таким образом, каждый раз, когда выдается 2 доллара, я получаю «c». Затем, после того, как изображение будет напечатано, скрипт ahk завершается, и я хотел бы, чтобы он снова был открыт снова, когда вставили еще 2 доллара. –

ответ

0

Похоже, что ваш отправитель не только отправляет символ 'c', но также и некоторые пробелы. Поэтому в основном вам просто нужно немного расслабиться в своем заявлении if.

Таким образом, вместо

if (indata == "c") 

пожалуйста, попробуйте, например

if (indata.Contains("c")) 
+0

Открывает файл, и когда отправляется другой c, он снова открывает файл. Это то, что мне нужно. Спасибо –

+0

Как я отметил в своем комментарии выше, это решение неверно. Если код получает более одного символа в одной операции приема, он все равно будет запускать этот процесс только один раз. –

+0

Вы не хотите 'if (indata.Trim() ==" c ")' или 'if (indata.StartsWith (" c "))'? В основном вы просто удаляете лишний CrLf и просматриваете всю строку для c, что затрудняет добавление других строк позже, потому что они не могут содержать c. – Trisped