いつも、お世話になっています
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()
で読み込むとエラーはでないのですが、受信するデータがバイナリのデータなので
バイト配列に書き込みたいのですが、上記の方法で何かまちがっているのでしょうか?
引数も間違っていないと思うのですが
どうぞ、よろしくお願いします
いや、そのコードではエラーしますが・・・
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
とかして設定できます。
最終的にどうしないといけないかは、データを送信する外部のもの
の仕様に準じますので、何かを教えてもらわないと解りません。
※ 教えてもらっても、こちらには同等のものが無いはずなので
確実なことは言えませんが・・・あしからず。
以上。頑張って下さい!
配列に1つずつ入れていかなければならないのですね。
sp.Read(ReName, 0, Sp.ReadBufferSize)
とすれば、一気に配列に代入できると思ってました
あと、Dim Rename() as byteをDim Rename(100) as byte
と、配列の大きさをしていしても同じエラーがでてしまうのですが
そもそも、
sp.Read(ReName, 0, Sp.ReadBufferSize)
の使い方が間違っていたということですね。
バイナリで受けとったデータを変換しているのは
確認の為です
データを送信してくる側が、バイナリデータでしか送信できない
仕様ですので、バイナリで受信して、中身を確認する為に
変換しようと思ったのですが、、
ここもとんちんかんな事をしてしまってるみたいですね、、、
初心者ですのでご容赦ください。
ええ〜と・・・
私の掲載したコードをそのまま使ったらどうなります?
それで読み込み部分でエラーしているなら話は別ですが。
以上。
単に配列の大きさが宣言されていないだけ。
Dim dt(SerialPort1.BytesToRead - 1) As Byte
SerialPort1.Read(dt, 0, SerialPort1.BytesToRead)
読み込みに関しては、これだけで良いはずですよ。
Text1.Text = names2
は
Text1.Text += names2
とした方が良いかな。
ツイート | ![]() |