2017-02-20 6 views
1

에서 서버 쪽 직렬 포트에서 데이터를받는 방법 서버 쪽의 직렬 포트에서 명령을 보내고받는 asp.net mvc 5 프로그램을 개발하려고합니다. 사실, 서버에 연결된 하드웨어가 있는데이 하드웨어에 명령을 보내고 응답을 받으려고합니다. asp.net mvc

내가 데이터를 보낼 때 사용하는 방법입니다 :

public static void SendData(string data) 
{ 
    SerialPort port = new SerialPort(
    "COM5", 9600, Parity.None, 8, StopBits.One); 


    port.Open(); 


    port.Write(data); 




    port.Close(); 
} 

을이 내받을 방법 : 내 수신 방법에 문제가

public static void ReceiveData() 
    { 
     if (port != null && port.IsOpen) 
      port.Close(); 
     port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived); 


     port.Open(); 


    } 
    public static void port_DataReceived(object sender, SerialDataReceivedEventArgs e) 
    { 
     int dataLength = port.BytesToRead; 
     byte[] data = new byte[dataLength]; 
     int nbrDataRead = port.Read(data, 0, dataLength); 
     if (nbrDataRead == 0) 
      return; 


     Taxi.Controllers.ReceiveController.Decision(System.Text.Encoding.UTF8.GetString(data)); 

    } 

. 하드웨어가 문자열을 보낼 때마다 색인보기에서 마지막 문자 만 볼 수 있습니다. 게시 된 문자열의 모든 문자를받는 receive 메서드를 만드는 방법이 궁금합니다.

+0

당신은 다른 사람들이 더 나은 귀하의 질문에 대답하기 위해 지금까지 노력했다 코드를 입력하십시오. –

+0

나는 그것이 ... 나는 대답에 너무 가깝다고 생각한다. 이 기사를 작성하고 있습니다. https://web.archive.org/web/20130709121945/http://msmvps.com/blogs/coad/archive/2005/03/23/SerialPort-_2800_RS_2D00_232-Serial-COM-Port_2900_- in-C_2300 _-. NET.aspx –

+0

오늘 나중의 답변을 기다리십시오. – Snoopy

답변

0

나는 내 대답을 찾았습니다. 이것은 직렬 포트의 전송 속도에 대한 간섭이며 서버의 속도를 수신 (계산)합니다! 당신이 보는대로, "port_DataReceived"방법의 첫 번째 줄에 수면 시간을 설정해야합니다

public static void port_DataReceived(object sender, SerialDataReceivedEventArgs e) 
    { 

     Thread.Sleep(TimeSpan.FromMilliseconds(100)); 
     int dataLength = port.BytesToRead; 
     char[] result = new char[dataLength]; 

     for (int len = 0; len < result.Length;) 
     { 


      len += port.Read(result, len, result.Length - len); 
     } 
     string send = ""; 
     for (int i = 0; i < result.Length; i++) 
     { 
      send += result[i]; 
     } 

     Taxi.Controllers.ReceiveController.Decision(send); 

    }