シリアル通信について

解決


Jack  2007-03-13 05:19:52  No: 135734

シリアル通信をして計測器からデータを取り込み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


我龍院  2007-03-13 06:10:00  No: 135735

Using ということは、VB2005ですか。
VB2005にはSerialPort クラス が有りますが、
これを使った方が楽です。


オショウ  2007-03-13 10:36:01  No: 135736

毎日のように外部機器と通信するプログラムを.NETで作っていますが
このプログラムはひどいと言うかサッパリ・・・

非同期で行いたいのか同期で行いたいのか?
シリアル通信のパラメータは?
外部機器からは、ポートをオープンしたら、垂れ流しで何もコマンド
を送らなくてもどんどんデータが受信されるような仕組みのものです
か?

何も機器の仕様も解らないので、添削のしようもありません・・・

以上。


Jack  2007-03-13 17:07:46  No: 135737

申し訳ありません。初心者ですので、詳しいことはわからないのですが、機器はピックテスターです。自分はポートを開いたらデータを受信できると思っていますが・・・。


そがっち  2007-03-13 20:48:22  No: 135738

私は.NET系でシリアル通信やった事は ないんですが、
とりあえず気になった事を。
ReceiveSerialDataは、どこで呼んでるんでしょう?


我龍院  2007-03-13 23:33:59  No: 135739

>>http://support.microsoft.com/kb/904795/ja
Jackさんが書いたのは、ここのコンソールアプリケーションを
Windows風に変えようとしたものなんでしょう。
チョッと無理があります。
前にも書きましたがSerialPort クラス を使いましょう。


Jack  2007-03-14 00:36:51  No: 135740

ありがとうございます。
実はまさにそのとおりで、そこからいただきました。
無理があるんですか・・・では、SerialPortクラスを使ってみます。


オショウ  2007-03-14 09:10:55  No: 135741

テストできないですが、まぁ〜こんな感じでしょうか!

※  動かなかったら、好きに改造して下さい。

フォームに・・・
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


我龍院  2007-03-14 19:50:25  No: 135742

>オショウさん
×  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で送られた場合
改行すら上手くいかないかも。


Jack  2007-03-15 01:37:36  No: 135743

ほんとうにありがとうございました。オショウさん、お忙しいのにプログラムを考えてくれてありがとうございます。我龍院さんも度重なる助言、参考になりました。ありがとうございます。
また、わからないことがある時は、どうかお願いします。


Jack  2007-03-15 02:42:23  No: 135744

ありがとうございました。


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

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






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