因みに、ボーレート 19200bps、パリティなし、ストップビット1です。 タイマーオブジェクトを使い、300msに一度、機械に送信しています。 Private Function SendTARGET_485(N As Integer) As Boolean
Dim D() As System.Byte Dim M$ Dim E$ Dim TEMP$ Dim I As System.Int32 Dim strStimeBuff As System.String Dim strEtimeBuff As System.String Dim flag As System.Boolean Dim intLen As System.Int32 = 0 Dim intPointer As System.Int32 = 0 Dim intReceivebytes As System.Int32 = 0 Dim dtNow As DateTime Dim dtTimeout As DateTime
'Stopwatchオブジェクトを作成する Dim sw As New System.Diagnostics.Stopwatch()
Do intReceivebytes = SerialPort1.Read(RTX_D, intPointer, RTX_D.Length - intPointer) intPointer += intReceivebytes dtTimeout = Now If (dtTimeout.Ticks - dtNow.Ticks) > 100000000 Then Me.Timer1.Enabled = False MsgBox("受信電文不可") Me.WriteLog("ここで強制終了(受信電文不可)") Return False End If
If intPointer >= 4 Then '返信時間取得 flag = True End If Loop While (flag = False)
If intLen > 4 Then Me.Timer1.Enabled = False MsgBox("受信電文不良発生") Me.WriteLog("ここで強制終了") Return False End If
E$ = "" For I = 0 To 4 TEMP$ = "00" + Hex$(RTX_D(I)) E$ = E$ + TEMP$.Substring(TEMP$.Length - 2) + " " Next I
'送信ログ Select Case N Case 1 Me.WriteLog("""" + strEtimeBuff + """,""" + "受信1" + """,""" + E$ + """") Case 2 Me.WriteLog("""" + strEtimeBuff + """,""" + "受信2" + """,""" + E$ + """") Case 3 Me.WriteLog("""" + strEtimeBuff + """,""" + "受信3" + """,""" + E$ + """") Case 4 Me.WriteLog("""" + strEtimeBuff + """,""" + "受信4" + """,""" + E$ + """") End Select
If sw.Elapsed.TotalMilliseconds > 300 Then Me.Timer1.Enabled = False MsgBox("処理時間が300msを超えました。") Me.WriteLog("ここで強制終了。処理時間が300msを超えました。") Return False End If
'受信した If (RcvFlag = 1) Then Return True Else Return False End If
Private STAT_TARGET_485 As System.Boolean Private RcvBuf As System.String Private RcvFlag As System.Int32 Private RTX_D() As System.Byte Private counter As System.Int32
Public Sub New()
' この呼び出しはデザイナーで必要です。 InitializeComponent()
' InitializeComponent() 呼び出しの後で初期化を追加します。 counter = 1 End Sub
Private Sub btnStart_Click(sender As Object, e As EventArgs) Handles btnStart.Click If SerialPort1.IsOpen = True Then
Try 'シリアルポートをオープンする. SerialPort1.Open() Timer1.Interval = Integer.Parse(Me.txtSpeed.Text) Timer1.Enabled = True Catch ex As Exception MsgBox(ex.Message) End Try
End If End Sub
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
Dim boolFlg As System.Boolean Try boolFlg = SendTARGET_485(counter) If boolFlg = False Then Me.Timer1.Enabled = False Exit Sub End If
counter += 1 If (counter > 30) Then counter = 1 End If Catch ex As Exception End Try End Sub Private Sub WriteLog(ByVal buff As System.String) 'Dim textFile As System.IO.StreamWriter 'textFile = New System.IO.StreamWriter(System.Reflection.Assembly.GetExecutingAssembly().Location + Now.ToString("yyyy-MM-dd") + ".LOG", True, System.Text.Encoding.Default) 'textFile.WriteLine(buff) 'textFile.Close()
Dim fs As New FileStream(System.Reflection.Assembly.GetExecutingAssembly().Location + Now.ToString("yyyy-MM-dd") + ".LOG", _ FileMode.Append, FileAccess.Write, FileShare.Write) Dim sr As TextWriter = New StreamWriter(fs, Encoding.GetEncoding("shift-jis")) Try sr.WriteLine(buff) sr.Close() fs.Close() Catch E As Exception ' Let the user know what went wrong. Console.WriteLine(E.Message) End Try End Sub
Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.Click 'シリアルポートをオープンしている場合、クローズする. If SerialPort1.IsOpen Then SerialPort1.Close() End If 'ダイアログをクローズする. Me.Close() End Sub