serialportコントロールの受信イベント


ひよこ  2009-02-25 18:54:01  No: 141563

いつも、お世話になっています
VB2005 windows 2000でプログラムしています

serialportコントロールの受信イベントについて質問させていただきます

formにserialportコントロールを配置して、データの送受信を行いたいのですが
受信がうまくいきません。

以下に受信コードを記述します

 Private Sub Sp_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles Sp.DataReceived
        
Dim Rename() as byte
dim names2 as string
        sp.Read(ReName, 0, Sp.ReadBufferSize)
        names2 = Encoding.Unicode.GetString(ReName, 0, ReName.Length)
        Text1.Text = names2
    End Sub
※spはserialportコントロールの名前です

serialportコントロールのDataReceivedイベントを使用しているのですが

sp.Read(ReName, 0, Sp.ReadBufferSize)

のところで、エラーがでます。
使用するにはNEWしてからのような、、(現在確認できない状態であいまいですいません)

 Names2 = Sp.ReadLine()

で読み込むとエラーはでないのですが、受信するデータがバイナリのデータなので
バイト配列に書き込みたいのですが、上記の方法で何かまちがっているのでしょうか?
引数も間違っていないと思うのですが

どうぞ、よろしくお願いします


オショウ  2009-02-26 06:53:43  No: 141564

いや、そのコードではエラーしますが・・・

Dim Rename() as byte

としている部分、当然、受信時の読み込みで配列の大きさが
ないので、エラーします。

    Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived

        Dim sp As SerialPort
        Dim dt() As Byte
        Dim count As Integer

        sp = DirectCast(sender, SerialPort)

        If e.EventType = IO.Ports.SerialData.Chars Then
            count = sp.ReadBufferSize
            ReDim dt(count - 1)
            For i As Integer = 0 To count - 1
                dt(i) = sp.ReadByte
            Next

            ' dt() ...

        End If

    End Sub

とするべきでしょう。

次に、バイナリ受信でありながら・・・
        names2 = Encoding.Unicode.GetString(ReName, 0, ReName.Length)
        Text1.Text = names2
としている部分ですが、バイナリ受信する意味が無いので、テキスト
受信してもよいのですが、実際に受信するデータの内容が、&h20未満
のものが含まれてますか?

無いならば・・・
            sz = sp.ReadExisting
と、一気に文字列変数に読み込めます。

また、受信データのエンコードは、
        SerialPort1.Encoding = System.Text.Encoding.Unicode
とかして設定できます。

最終的にどうしないといけないかは、データを送信する外部のもの
の仕様に準じますので、何かを教えてもらわないと解りません。

※  教えてもらっても、こちらには同等のものが無いはずなので
    確実なことは言えませんが・・・あしからず。

以上。頑張って下さい!


ひよこ  2009-02-27 19:37:52  No: 141565

配列に1つずつ入れていかなければならないのですね。

sp.Read(ReName, 0, Sp.ReadBufferSize)

とすれば、一気に配列に代入できると思ってました

あと、Dim Rename() as byteをDim Rename(100) as byte

と、配列の大きさをしていしても同じエラーがでてしまうのですが
そもそも、
sp.Read(ReName, 0, Sp.ReadBufferSize)
の使い方が間違っていたということですね。

バイナリで受けとったデータを変換しているのは
確認の為です

データを送信してくる側が、バイナリデータでしか送信できない
仕様ですので、バイナリで受信して、中身を確認する為に
変換しようと思ったのですが、、

ここもとんちんかんな事をしてしまってるみたいですね、、、
初心者ですのでご容赦ください。


オショウ  2009-02-27 22:55:45  No: 141566

ええ〜と・・・

私の掲載したコードをそのまま使ったらどうなります?

それで読み込み部分でエラーしているなら話は別ですが。

以上。


我龍院  2009-03-01 03:19:32  No: 141567

単に配列の大きさが宣言されていないだけ。
Dim dt(SerialPort1.BytesToRead - 1) As Byte
SerialPort1.Read(dt, 0, SerialPort1.BytesToRead)
読み込みに関しては、これだけで良いはずですよ。

Text1.Text = names2

Text1.Text += names2
とした方が良いかな。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加