2013-04-19 4 views
1

이 프로그램은 두 개의 COM 포트를 열어 하나에서 다른 하나까지 1 초 동안 데이터를 보내도록 설계되었습니다. 사용자는 어느 포트가 송신하고 어느 포트가 수신 하는지를 입력한다. 내가 가지고있는 문제는 ElapsedEventHandler()가 두 개의 기본 인수가있는 OnTimedEvent() 함수를 사용하는 것입니다. OnTimedEvent() 함수가 송신 포트에 무언가를 쓰고 수신 포트에서 읽은 다음 콘솔에 표시하려고합니다. 분명히 내 코드는 포트와 메시지가 OnTimedEvent()의 범위에 없기 때문에 지금 가지고있는 방식대로 작동하지 않습니다. 그 기능을 내가 원하는대로 작동하게하려면 어떻게해야합니까? 미리 감사드립니다. 내가 대신 System.Threading.Timer을 사용하는 것이 좋습니다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

당신이 할 수있는 가장 좋은 일은 OOP를 배우는 것입니다. 코드는 20 세가됩니다. 클래스에서 포트 연산을 랩핑하고, 두 개의 포트가있는 클래스에 타이머를 랩핑하고 속성으로 처리합니다. 필요한 곳에 필요한 객체가 있습니다. 키워드는'objects'입니다. –

답변

2

, 당신은 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 : 이상합니다. 'Elapsed' 이벤트에 대한 문서에서 특정 버전에 대해서는 언급하지 않았습니다. 그러나 클래스 자체에 대한 문서에서 .NET 2.0 이하를 언급합니다. –