2016-06-18 2 views
1

Modbusプロトコルでシリアルポートデバッグツールを使用してデータを受信することができます。SerialPortクラスのCardReaderからデータを受信できません

以下のパラメータは同じです。しかし、私はDataReceivedメソッドでブレークポイントを設定しましたが、決して遭遇しません。私のプログラムは以下の通りです:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.IO.Ports; 
using System.Linq; 
using System.Text; 
using System.Threading; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace TestBalance 
{ 
    public partial class Form1 : Form 
    { 
     SerialPort sp; 
     public Form1() 
     { 
      InitializeComponent(); 
      sp = new SerialPort("COM21", 9600, Parity.None, 8, StopBits.One); 
      sp.Open(); 
      sp.ReceivedBytesThreshold = 1; 
      sp.RtsEnable = true; 
      sp.DtrEnable = true; 
      sp.DataReceived+=sp_DataReceived; 
      sp.Write("01 03 100b 0002 b109"); 
      Thread.Sleep(200); 
      //string message= sp.ReadExisting(); 
      //MessageBox.Show(message); 
     } 

     private void sp_DataReceived(object sender, SerialDataReceivedEventArgs e) 
     { 
      string message = sp.ReadLine(); 
      MessageBox.Show(message); 
     } 
    } 
} 
+0

フォームを使用すると、特にコンストラクタでスリープする必要はありません。 sleep()を削除します。 – jdweng

+0

あなたが話しているデバイスはおそらく "01 03 100b 0002 b109"が何を意味するのか分かりません。代わりにWrite(byte []、int、int)オーバーロードを使用する必要があります。 –

+0

@HansPassant彼は何らかの種類のEOLを必要とするかもしれません。私たちは彼のデバイスがどう働いているのか分かりません。 – Snoopy

答えて

0

あなたのデバイスの動作に関する多くの情報はありません。私はあなたの問題であるかもしれないことにいくつかの推測しか取ることができません。

デバイスが同期している場合は、デバイスにEOL(End of Line)シーケンスを送信していることを確認してください。デバイスの中には、データの送信を知らせるためにEOLが必要なものがあります。このEOLは、しばしば改行に続いて、改行、または単に改行である。したがって、データを"01 03 100b 0002 b109\r"に変更する必要があります。キャリッジリターンを追加したことに注目してください。また、改行の場合は"\n"、改行の場合は"\r\n"を使用できます。改行。

また、使用しているデバイスの種類がわからない。シリアルポートの設定がすべて正しいことを確認することをお勧めします。ボーレートが実際に9600であることを確認してください。あなたが望むものを選ぶだけでは、使用しなければならないハードウェアの中で、話しているデバイスがあらかじめボーレートを持っています。

また、COMポート番号が正しいことを確認してください。デバイスマネージャを開き、正しいポートと通信していることを確認します。

最後に、はありません私はどのようにあなたがそれをやったのSerialPortクラスを購読誰も見た。 MSDN example right hereと正しく一致するようにコードを変更してください。使用:

this.sp.DataReceived 
    += new SerialDataReceivedEventHandler(this.sp_DataReceived); 
+0

ありがとう、あなたのアドバイスが役に立ちます。 –

+0

@ John.Yan Yeah、NP。私は 'Write(byte [] ...')メソッドがあなたのために働いていたことを知っています。バイトを送信しようとしているだけではわかりませんでした。 – Snoopy

関連する問題