2016-06-28 14 views
-1

データの送受信にCOM4シリアルポートを使用しています。私は要求が来ている - 私は要求がmydatastring = myrequeststringであることを確認する - これは正常に動作します。このイベントハンドラ中にcomポート経由でデータに返信しようとしていますが、もちろんアクセスは拒否されています。私の要求を受けてからデータを送信するにはどうすればいいですか?シリアルポート受信中にデータを送信イベント

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

EDIT 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シリアルポートには、Transmitメソッドがありません。 – dbasnett

+0

@dbasnett - 関連するコードをいくつか追加しました。基本的にシリアルポートのカプセル化です。 – Ken

答えて

0

これは動作しますが、それがない理由を私は知りません。シリアルポートがインスタンス化されたとき - 私はイベントハンドラを作成し、それはイベントを発生させましたが、そのイベントの処理中にポートを通して返信を送信できませんでした。 しかし、ポートが開いてからイベントを購読するとイベントが発生し、ポートにアクセスして返信します。

私は完全なコードを投稿しませんでしたが、送信する前にポートが開いていることを確認し、そうでなければポートを開きます。 今すぐ受信イベントを購読する代わりに、ポートを開いてからOnReceiveイベントを購読します。

ポートがオープンされた後にサブスクライブするように変更したのは、ポートがオープンする前にサブスクライブすることによって引き起こされた奇妙な動作について、SOや他のサイトで読んでいたからです。

したがって、ポートが開いた後、受信イベントに登録します。

関連する問題