2016-06-28 4 views
-1

데이터를 보내고 받기 위해 COM4 시리얼 포트를 사용하고 있습니다. 내가 들어오는 요청 요청이 있습니다 - 요청이 mydatastring = myrequeststring임을 확인합니다 -이 작동합니다. 이 이벤트 처리기에서 com 포트를 통해 데이터를 회신하려하지만 물론 액세스가 거부되었습니다. 요청을받은 후 데이터를 보내려면 어떻게해야합니까?시리얼 포트 수신 중 데이터 전송 이벤트

void scScale_OnReceiving(object sender, DataStreamEventArgs e) 
    { 
     if(e.Response == myrequeststring) 
     { 
      scScale.Transmit(this.data); 
     }    
    } 

편집 scScale의

관련 부분 - 그것이하여 SerialPort 클라이언트 클래스는 - 기본적으로하여 SerialPort 세부 사항을 캡슐화합니다.

관련 코드 :

public bool OpenConn() 
{ 
    try 
    { 
     if (_serialPort == null) 
      _serialPort = new SerialPort(_port, _baudRate, Parity.None); 

     if (!_serialPort.IsOpen) 
     { 
      _serialPort.ReadTimeout = -1; 
      _serialPort.WriteTimeout = -1; 

      _serialPort.Open(); 

      if (_serialPort.IsOpen) 
      { 
       serThread.Start(); /*Start The Communication Thread*/ 
       IsOpen = true; 
      } 
      else 
      { 
       IsOpen = false; 
      } 

     } 
    } 
    catch (Exception ex) 
    { 
     return false; 
    } 

    return true; 
} 


public void Transmit(string packet) 
{ 
    _serialPort.Write(packet); // 0, packet.Length); 
} 

public void Transmit(byte[] packet) 
{ 
    _serialPort.Write(packet, 0, packet.Length); 
} 
public int Receive(byte[] bytes, int offset, int count) 
{ 
    int readBytes = 0; 

    if (count > 0) 
    { 
     readBytes = _serialPort.Read(bytes, offset, count); 
    } 

    return readBytes; 
} 
    private void OnSerialReceiving(byte[] res) 
    { 
     if (OnReceiving != null) 
     { 
      OnReceiving(this, new DataStreamEventArgs(res)); 
     } 
    } 

SCSCALE 링크에서이 코드입니다 .. https://roofman.wordpress.com/2012/09/13/fast-serial-communication-for-c-real-time-applications/

+0

보낸 사람이 직렬 포트입니까? 그렇다면 캐스팅하지 않고 대신 사용하십시오. – Peter4499

+0

scScale이란 무엇입니까? 표준 Windows 직렬 포트에는 전송 방법이 없습니다. – dbasnett

+0

@dbasnett - 관련 코드를 추가했습니다. 기본적으로 직렬 포트를 캡슐화했습니다. – Ken

답변

0

이 작동하지만이하는 이유를 모르겠어요; 직렬 포트가 인스턴스화되었을 때 - 이벤트 핸들러를 생성했는데 이벤트를 발생 시켰지만 해당 이벤트를 처리하는 동안 포트를 통해 응답을 보낼 수 없었습니다. 그러나 포트가 열린 후에 이벤트에 가입하면 이벤트가 발생하고 포트에 액세스하여 회신을 보내게됩니다.

완전한 코드를 게시하지는 않았지만 전송하기 전에 포트가 열려 있는지 확인하고 그렇지 않은 경우 포트를 엽니 다. 이제 수신 이벤트에 즉시 등록하는 대신 포트를 열고 OnReceive 이벤트에 가입합니다.

포트가 열린 후에 구독하도록 코드를 변경 한 이유는 포트가 열리기 전에 가입으로 인해 이상한 행동에 대해 읽고있는 중이었기 때문입니다.

따라서 포트가 열린 후에 receive 이벤트를 구독하십시오.