シリアル通信をして計測器からデータを取り込みPC画面に出したいのですがどうしたらいいのかわかりません。全くの初心者なのでお願いします。データをテキストボックスに出す方法を教えてください。いちおう、途中までは自分でやってみたのですがうまくいきません。どうかお願いします。
Public Class Form1
'ポートを開く
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Using com1 As IO.Ports.SerialPort = My.Computer.Ports.OpenSerialPort("COM1", 1200)
com1.DtrEnable = True
End Using
End Sub
Sub GetSerialPortNames()
' 利用可能なシリアルポートの表示
For Each sp As String In My.Computer.Ports.SerialPortNames
ListBox1.Items.Add(sp)
Next
End Sub
' 利用可能なシリアルポートの表示
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
GetSerialPortNames()
End Sub
Function ReceiveSerialData() As String
'シリアルポートから受信
Dim returnStr As String = ""
Using com1 As IO.Ports.SerialPort = _
My.Computer.Ports.OpenSerialPort("COM1")
Do
Dim Incoming As String = com1.ReadLine()
If Incoming Is Nothing Then
Exit Do
Else
returnStr &= Incoming & vbCrLf
End If
Loop
End Using
Return returnStr
End Function
Using ということは、VB2005ですか。
VB2005にはSerialPort クラス が有りますが、
これを使った方が楽です。
毎日のように外部機器と通信するプログラムを.NETで作っていますが
このプログラムはひどいと言うかサッパリ・・・
非同期で行いたいのか同期で行いたいのか?
シリアル通信のパラメータは?
外部機器からは、ポートをオープンしたら、垂れ流しで何もコマンド
を送らなくてもどんどんデータが受信されるような仕組みのものです
か?
何も機器の仕様も解らないので、添削のしようもありません・・・
以上。
申し訳ありません。初心者ですので、詳しいことはわからないのですが、機器はピックテスターです。自分はポートを開いたらデータを受信できると思っていますが・・・。
私は.NET系でシリアル通信やった事は ないんですが、
とりあえず気になった事を。
ReceiveSerialDataは、どこで呼んでるんでしょう?
>>http://support.microsoft.com/kb/904795/ja
Jackさんが書いたのは、ここのコンソールアプリケーションを
Windows風に変えようとしたものなんでしょう。
チョッと無理があります。
前にも書きましたがSerialPort クラス を使いましょう。
ありがとうございます。
実はまさにそのとおりで、そこからいただきました。
無理があるんですか・・・では、SerialPortクラスを使ってみます。
テストできないですが、まぁ〜こんな感じでしょうか!
※ 動かなかったら、好きに改造して下さい。
フォームに・・・
3個のボタン
1個のテキストボックス
を置いて・・・
Imports System.IO.Ports
Public Class Form1
Private devPort As SerialPort
Delegate Sub TextBox_Delegate(ByVal sz As String)
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
TextBox1.Text = ""
Button1.Text = "Open"
Button2.Text = "Close"
Button3.Text = "Quit"
Button1.Enabled = True
Button2.Enabled = False
Button3.Enabled = True
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim bRet As Boolean
bRet = False
devPort = New SerialPort
With devPort
.PortName = "COM1"
.BaudRate = 1200
.DataBits = 8
.Parity = Parity.None
.StopBits = StopBits.One
.Handshake = Handshake.None
.Encoding = New System.Text.ASCIIEncoding
End With
Try
devPort.Open()
bRet = True
Catch ex As Exception
bRet = False
End Try
If bRet Then
AddHandler devPort.DataReceived, AddressOf OnReceive
With devPort
.DtrEnable = True
.RtsEnable = True
.ReceivedBytesThreshold = 1
.ReadTimeout = SerialPort.InfiniteTimeout
End With
Button1.Enabled = False
Button2.Enabled = True
Button3.Enabled = False
Else
MsgBox("SerialPort Not Open!!", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "SerialPort Error")
End If
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
devPort.DiscardInBuffer()
With devPort
.DtrEnable = False
.RtsEnable = False
End With
RemoveHandler devPort.DataReceived, AddressOf OnReceive
devPort.Close()
devPort.Dispose()
Button1.Enabled = True
Button2.Enabled = False
Button3.Enabled = True
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Me.Close()
End Sub
Private Sub OnReceive(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs)
Dim sz As String
If devPort.BytesToRead = 0 Then
Exit Sub
End If
sz = devPort.ReadLine
Invoke(New TextBox_Delegate(AddressOf TextBox_Invoke), sz)
End Sub
Private Sub TextBox_Invoke(ByVal sz As String)
TextBox1.Text = sz
End Sub
End Class
>オショウさん
× Invoke(New TextBox_Delegate(AddressOf TextBox_Invoke), sz)
〇 TextBox1.Invoke(New TextBox_Delegate(AddressOf TextBox_Invoke), sz)
△MsgBox("SerialPort Not Open!!", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "SerialPort Error")
〇MsgBox("SerialPort Not Open!!", CType(MsgBoxStyle.Information + MsgBoxStyle.OkOnly, MsgBoxStyle), "SerialPort Error")
1文字毎にクリアーされると見難いので
〇TextBox1.Text = sz
◎TextBox1.Text += sz
ただしこれはユニコードどうしの接続になります、s-Jisで送られた場合
改行すら上手くいかないかも。
ほんとうにありがとうございました。オショウさん、お忙しいのにプログラムを考えてくれてありがとうございます。我龍院さんも度重なる助言、参考になりました。ありがとうございます。
また、わからないことがある時は、どうかお願いします。
ありがとうございました。
ツイート | ![]() |