2013-04-19 2 views
1

Эта программа предназначена для открытия двух COM-портов и отправки данных от одного к другому за 1 секунду. Пользователь вводит, какой порт передает и какой порт получает. Проблема, с которой я столкнулась, связана с ElapsedEventHandler() в функции OnTimedEvent(), которая имеет два аргумента по умолчанию. Я хочу, чтобы функция OnTimedEvent() записывала что-то на порт отправки и читала ее на приемном порту, а затем отображала ее на консоли. Очевидно, что мой код не будет работать так, как сейчас, потому что порты и сообщения не входят в область OnTimedEvent(). Что я могу сделать, чтобы эта функция работала так, как я хочу? Заранее спасибо.Передача аргументов в ElapsedEventHandler C#

using System; 
using System.IO.Ports; 
using System.Timers; 

public class serial_test1 
{ 
    public static void Main(string[] args) 
    { 
     string sender; 
     string recver; 
     string buff_out; 
     string message; 
     SerialPort send_port; 
     SerialPort recv_port; 

     if (args.Length == 1) 
     { 
      sender = "UART"; 
      recver = "USB"; 
      message = args[0]; 
     } 
     else if (args.Length == 2) 
     { 
      sender = args[0]; 
      message = args[1]; 
      if (sender == "USB") 
      { 
       recver = "UART"; 
      } 
      else 
      { 
       recver = "USB"; 
      } 
     } 
     else 
     { 
      sender = "UART"; 
      recver = "USB"; 
      message = "TEST MESSAGE"; 
     } 


     int baud = 115200; 
     int data_bits = 8; 
     Parity parity = Parity.None; 
     StopBits stop_bits = StopBits.One; 

     buff_out = message; 

     SerialPort UARTport = new SerialPort("COM1", baud, parity, data_bits, stop_bits); 
     SerialPort USBport = new SerialPort("COM7", baud, parity, data_bits, stop_bits); 

     UARTport.Open(); 
     USBport.Open(); 


     if (sender == "USB") 
     { 
      send_port = USBport; 
      recv_port = UARTport; 
     } 
     if (sender == "UART") 
     { 
      send_port = UARTport; 
      recv_port = USBport; 
     } 

     string header = "from " + sender + " port to " + recver + " port"; 
     Console.WriteLine(header); 

     Timer aTimer = new System.Timers.Timer(); 
     aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 
     // Set the Interval to 1 second. 
     aTimer.Interval = 1000; 
     aTimer.Enabled = true; 

     UARTport.Close(); 
     USBport.Close(); 
     Console.ReadLine(); 
    } 

    private static void OnTimedEvent(object source, ElapsedEventArgs e) 
    { 
     string buff_in; 
     send_port.WriteLine(buff_out); 
     buff_in = recv_port.ReadLine(); 
     Console.WriteLine(buff_in); 
    } 
} 
+0

Лучшее, что вы можете сделать, это узнать ООП, ваш код выглядит 20 лет. Оберните операции порта в классе, оберните таймер в классе, который имеет два порта в качестве свойств и вуаля - у вас есть нужные вам объекты там, где они вам нужны. Ключевое слово - «объекты». –

ответ

2

Я предлагаю использовать System.Threading.Timer вместо этого, вы можете перейти в состоянии объекта в конструктор, который передаваемый в TimerCallback.

+2

Я согласен. Я препятствую использованию 'System.Timers.Timer' вообще, потому что он проглатывает исключения. См. Мой блог, http://blog.mischel.com/2011/05/19/swallowing-exceptions-is-hiding-bugs/, для информации. –

+0

+1 - Не понял Таймеры все еще проглотили исключения. Странно, что статья MSDN явно заявляет, что .NET 2.0 и ниже делает это, и «Это поведение может быть изменено в будущих выпусках .NET Framework». тогда как он должен сказать, что .NET 4.0 и ниже IMHO (если у меня не хватает тонкой разницы). – keyboardP

+0

@keyboardP: Нечетный. В документации для события «Истекшее» в нем не упоминается конкретная версия. Но в документации для самого класса упоминается .NET 2.0 и ниже. –

Смежные вопросы