タイトル : Re^3: VB2005で、シリアル通信について 投稿日 : 2009/04/27(Mon) 17:58 投稿者 : オショウ
> 機器はオムロンのPLCになります。 > 上位リンクコマンドで通信をさせようと考えております。 > 一回、オショウ 様の指摘した部分を見直してみます。 オムロンのPLCでしたら、数年前にVB2005で作成した通信クラス を保有しています。FINSコマンド体系です。 シリアル通信設定は、そう差異が無いと思いますが・・・ devPort = New Ports.SerialPort AddHandler devPort.DataReceived, AddressOf OnDataReceived CPU_NO = CpuNo devPort.BaudRate = Baudrate devPort.DataBits = Databit devPort.Parity = Paritybit devPort.StopBits = Stopbit devPort.WriteTimeout = Ports.SerialPort.InfiniteTimeout devPort.ReadTimeout = Ports.SerialPort.InfiniteTimeout devPort.PortName = "COM" + Port.ToString.Trim devPort.Handshake = Ports.Handshake.None devPort.ReadBufferSize = 512 devPort.Open() devPort.DiscardInBuffer() devPort.DiscardOutBuffer() devPort.DtrEnable = True devPort.RtsEnable = True その時のシリアルポートをオープンする際の設定コードです。 ※ 通信タイムウアトは、自分のクラス内で別途やってます。 デリミタは、&h0D ですので・・・ Public Sub OnDataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Dim dev As SerialPort Dim bRet As Boolean Dim sz As String dev = DirectCast(sender, SerialPort) If e.EventType = SerialData.Chars Then Try sz = dev.ReadTo(VbCr) Catch ex As Exception sz = String.Empty End Try If sz <> String.Empty Then bRet = ConvertData(sz, dt) If bRet Then If RecvTimeout IsNot Nothing Then RecvTimeout.Dispose() RecvTimeout = Nothing End If RaiseEvent ReceiveData(dt) If ReceiveDone IsNot Nothing Then ReceiveDone.Set() End If End If End If End If End Sub 実際のプログラムからの抜粋で、不必要な部分を抜いてますので このままでは正常に動作しません。 適宜修正変更して下さい。 ※ PLC通信クラスにしていますので、その受信イベントの中から 受信データを元プログラムに戻す為にRaiseEvent使ってます。 ※ RecvTimeoutは、通信タイムアウトを通信クラス内で別途定義し 使っているものです。 宣言は以下・・・ Private RecvTimeout As Threading.Timer Private ReceiveDone As ManualResetEvent 以上。(あくまで)参考まで・・・ |