none
利用SerialPort實作COM通訊的一些小問題 RRS feed

  • 問題

  • 各位大大

    作業環境 XPP

    軟體 VS2005

    小弟我 利用 SerialPort 透過 RS232 讀取 設備的資料

    雖然 有做出來 不過效果 並不是很好><"

    所以 這裡有一些我遇到的小小問題 想詢求解答一下

    1.SerialPort 的 DataReceived 的觸發條件 到底為何

       好像是有資料 就會觸發

       最後沒辦法 只好用 BytesToRead 限制他至少到我所想要的BYTE數 才做

       不過這是因為 我要用的資料"01798000000020"<==20 的部份  是0x20 是我要收到的BYTE數

       不然 我也沒辦法這樣做

       爬文 有看到 ReadTimeout 使用起來 好像沒效果一樣

    2.我使用

    Code Snippet

       Sub Code_Function() 

        Dim I&
        For I = C_Start To 1048575 Step 32
            C_Start = I
            Call ReadPower(9)
            Fr1Lab = Hex(I)
            If G_Quit = True Then Exit For
        Next
       
       
        If I > 1048575 Then
            CWButton1.Value = False
        End If
       End Sub

     

    去讀取 設備的Buffer值

    範圍 00~FFFFF

    我這樣讀取 效率非常不好 不知道 各位大大 有沒有 比較好比較快的 讀取方式

    而且 常常 會發生  程式當掉

    但是 我要問值的字串 有一直在丟 機器也一直有回應

    因該一回應 畫面就會秀出來 但是跑完了 畫面卻空空的

    其中的 Call ReadPower(9) 是我的SUB 她會送讀值字串 且等待回應 秀在畫面上

    我在想可能缺少 等待時間

    不過 嘗試 加在一些地方 都沒啥作用

    所以 想請各位大大 幫我看一下

      

    Code Snippet

    Private Sub ReadPower(byval index as integer)

    select case index

     

    case 9

            If Txt1.Text = "" Or Txt1.Text = Nothing Then Exit Sub
            Try
                Dim sendStr As String = ""
                Dim S_Out1() As Byte, si As Int16 = 0
                Com1.DiscardInBuffer()
                CountData = Val("&H" & Microsoft.VisualBasic.Right(Txt1.Text, 2) & "&")
                sendStr = Trim(UCase(Txt1.Text)) & ModBus_GetCRC(UCase(Txt1.Text))
                'bytes = Encoding.ASCII.GetBytes(sendStr)
                ReDim S_Out1((Len(sendStr) / 2) - 1)
                For SI = 1 To Len(sendStr) Step 2
                    S_Out1((si - 1) / 2) = Val("&H" & Mid(sendStr, si, 2) & "&")
                Next SI

                Com1.Write(S_Out1, 0, S_Out1.Length)
                'With Rtxt1
                '.SelectionColor = Color.Black
                '.SelectionBackColor = Color.AliceBlue
                '.AppendText("傳送 ← " & sendStr & vbCrLf)
                '.ScrollToCaret()
                'End With
                'Txt1.Text = String.Empty
            Catch ex As Exception
                MsgBox(ex.ToString)
            End Try

    end select

    End Sub

     

     

    接收的部分

    Code Snippet

    Private Sub DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles com1.DataReceived
            Rtxt1.Invoke(New myDelegate(AddressOf updateTextBox), New Object() {})
    End Sub

     

    Public Sub updateTextBox()
            If Com1.BytesToRead >= CountData + 6 Then
                Com1.ReadTimeout = 200
                Dim Gdata(Com1.BytesToRead - 1) As Byte
                Com1.Read(Gdata, 0, Com1.BytesToRead - 1)
                Dim i As Int16
                Dim data As String = Nothing
                Dim data1 As String = Nothing
                For i = 0 To UBound(Gdata) - 1
                    data &= Microsoft.VisualBasic.Right("00" & Hex(Gdata(i)), 2)
                Next

                If Microsoft.VisualBasic.Right(data, 4) = ModBus_GetCRC(Mid(data, 1, Len(data) - 4)) Then
                    For i = 1 To Len(Mid(UCase(data), 7, 64)) Step 2
                        data1 &= Mid(Mid(UCase(data), 7, 64), i, 2) & " "
                    Next
                    With Rtxt1
                        .SelectionColor = Color.Red
                        .SelectionBackColor = Color.GhostWhite
                        .AppendText(Microsoft.VisualBasic.Right("000000" & Microsoft.VisualBasic.Right(Txt1.Text, 2), 6) & "    " & data1 & vbCrLf)
                        .ScrollToCaret()
                    End With
                End If
            End If
    End Sub

     

    再次麻煩各位大大了

    感激不盡^^

     

    2008年6月6日 上午 02:08

解答

  • 讀值 部份  現在已經OK

    不過真的給它讀很慢

    不過這是硬體部份的問題 我也沒辦法了

    限制每筆資料 64BYTE 真的是要給它讀很久呢><"

    2008年6月9日 上午 03:40

所有回覆

  • 讀值 部份  現在已經OK

    不過真的給它讀很慢

    不過這是硬體部份的問題 我也沒辦法了

    限制每筆資料 64BYTE 真的是要給它讀很久呢><"

    2008年6月9日 上午 03:40
  • 應該不會慢吧 !? 如果64byte 不夠用, 64byte 可以在 COM 控制項屬性裏面改掉啊.

     

    2008年6月12日 上午 01:35
  • 大大

    因為是 硬體的限制

    所以 我最大就是 64

    但是因為

    前有起始命令後還有CRC 所以 我只能問到58BYTE

    所以 1MB 讀完

    要花 16分鐘左右(和計算後的結果差不多 所以 也沒辦法再快了)

    這也是沒辦法了

    除非 改硬體了

    不過還是謝謝大大了唷

    2008年6月16日 上午 10:16
  • 是你資料來源的硬體速度慢嗎?

     

    假設總讀取時間為 15 分鐘 = 900 秒

    1 MB = 1048576 bytes = 8388608 bits

    8388608 / 900 = 9320.67

     

    如果你硬體的包率是 9600 / 14400 ,這樣的速率是可以接受的,因為還有控制碼造成的損失,如果是更高速的設備,請向硬體廠商洽詢。

     

    2008年6月16日 上午 10:35
    版主
  •  

    謝謝 璉璉大大

    我的硬體速度  RS485 是 19600

    扣掉 每次傳輸前 要開關 RTS腳位 大約是 200ms

    所以 16分鐘 算是差不多

     

    2008年6月16日 下午 12:04