tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルSerialPort1_DataReceivedが発生しません
記事No10871
投稿日: 2012/08/04(Sat) 17:34
投稿者et
お世話になります。
シリアルポートの受信について投稿させていただきます。
開発環境:VB2010pro Win7    

Form1_LoadでSerialPort1.Open()して、SerialPort1_DataReceivedのイベントを取得しようとしていますが、イベントが発生しません。
パソコン2台で送信側、受信側を作ってMU-2ソフトで送受信の確認はできました。
SerialPort1.Open()の設定で足りないこととか、受信方法の違いを教えて頂けないでしょうか。
宜しくお願いします。

    Private Sub Form1_Load(ByVal sender As System.Object, _
                           ByVal e As System.EventArgs) Handles MyBase.Load
        'シリアルポートをオープンする。
        Call SerialOpen()
    End Sub

    Private Sub SerialOpen()

        'シリアルポート
        SerialPort1.PortName = "COM3"
        'ボーレート
        SerialPort1.BaudRate = 19200
        'データビットをセットする. (データビット = 8ビット)
        SerialPort1.DataBits = 8
        'パリティビットをセットする. (パリティビット = なし)
        SerialPort1.Parity = Parity.None
        'ストップビットをセットする. (ストップビット = 1ビット)
        SerialPort1.StopBits = StopBits.One

        Try
            'シリアルポートをオープンする.
            SerialPort1.Open()
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

    End Sub
    'シリアルポートがデータ受信した時のイベント
    Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
        Call DataRead()
    End Sub
    '
    Private Sub DataRead()
        Dim data As String = ""
        '受信する
        data = SerialPort1.ReadLine()

[ツリー表示へ]
タイトルRe: SerialPort1_DataReceivedが発生しません
記事No10872
投稿日: 2012/08/04(Sat) 18:09
投稿者オショウ
> Form1_LoadでSerialPort1.Open()して、SerialPort1_DataReceivedのイベントを取得しようとしていますが、イベントが発生しません。

  非同期送受信なので、ReceivedBytesThreshold を設定しないと
  受信イベントは発生しないかと・・・

  あと、DataReceived でイベントが発生しても、それは受信
  以外のイベントを含んでいるので

  If e.EventType = IO.Ports.SerialData.Chars Then

  とかして、受信イベントである場合にのみ、データを読み取
  る動作として下さい。

以上。

[ツリー表示へ]
タイトルRe^2: SerialPort1_DataReceivedが発生しません
記事No10873
投稿日: 2012/08/06(Mon) 15:19
投稿者et
早速ありがとうございます。

ReceivedBytesThreshold=1(既定値)でopenしています。
設定方法は、受信桁数によるのでしょうか教えてください。
18桁:*DR=0cXXU01315472*
このようなデータを受信しようとしています。
12桁〜15桁のデータを切り取って数値データ変換して使用します。
何とか急いで受信できるまでにしたいのですが、
イベントが発生しないので進みません。
宜しくお願いします。

[ツリー表示へ]
タイトルRe^3: SerialPort1_DataReceivedが発生しません
記事No10874
投稿日: 2012/08/06(Mon) 16:48
投稿者オショウ
> ReceivedBytesThreshold=1(既定値)でopenしています。

  その設定で受信イベントが発生しないのであれば、ハンドシェイク設定
  が、ハードフローで、その信号がオフになっている・・・
  くらいしか考えられません。

  ハンドシェイクは、なしでしょうか?ハードフローでしょうか?

> 設定方法は、受信桁数によるのでしょうか教えてください。
> 18桁:*DR=0cXXU01315472*
> このようなデータを受信しようとしています。
> 12桁〜15桁のデータを切り取って数値データ変換して使用します。
> 何とか急いで受信できるまでにしたいのですが、
> イベントが発生しないので進みません。

  受信イベントのところで、どのように受信プログラム組んでますか?
  18ケタの最終の『*』の後ろには、CR/LF等のデリミタは無いという
  ことですネ?!デリミタがあれば、そのデリミタ文字まで全て受信す
  ると言う機能があるのですが・・・

以上。

[ツリー表示へ]
タイトルRe^4: SerialPort1_DataReceivedが発生しません
記事No10875
投稿日: 2012/08/06(Mon) 19:27
投稿者et
お世話になります。

>   ハンドシェイクは、なしでしょうか?ハードフローでしょうか?
ハンドシェイクは、なしです。

> > 18桁:*DR=0cXXU01315472*
> > このようなデータを受信しようとしています。
> > 12桁〜15桁のデータを切り取って数値データ変換して使用します。
>
>   受信イベントのところで、どのように受信プログラム組んでますか?
      data = SerialPort1.ReadLine()
   これで受信しようとしていますが、1桁ずつ切り取って判断した方が良いでしょうか?
   その場合はどのように処理すれば良いですか?
   宜しくお願いします。

[ツリー表示へ]
タイトルRe^5: SerialPort1_DataReceivedが発生しません
記事No10876
投稿日: 2012/08/07(Tue) 00:48
投稿者オショウ
>       data = SerialPort1.ReadLine()

  多分、受信イベントは起きてます。

  が・・・

  受信イベントは起きても、ReadLine()を使ったら、文字列の最後尾に
  LFが無いと、無限待ちになってしまい、受信が終わらずにイベントが
  起きていないようになります。

  sz = SerialPort1.ReadTo("*")

  とかしてみれば、2回に一度、正しく受信できるようになるかと。

  要は、『*DR=0cXXU01315472*』の1文字目を受信した段階でszには
  受信文字列なしでReadToから返ってきます。が、残りの文字列であ
  る『DR=0cXXU01315472*』を受信した段階でもう一度ReadToから返っ
  てきます。その場合、受信文字列の先頭文字列が『DR=』であれば
  正常受信と判断してやればOKでは?

以上。参考まで

[ツリー表示へ]