none
VB2008 RS232 接收問題。 開第兩組 comport 接收資料,接收資料隨機錯誤 RRS feed

  • 一般討論

  • 各位 大家好
    本設計軟體只開啟一組comport1 作RS232資料傳輸接收,系統穩定

    系統需求另外開啟comport3,開啟後接收單晶片串列資料(接上RS232線) 初步短時間系統正常運轉,測試一段時間或停止運轉,軟體則會停止顯示接收值

    comprot3 單晶片串列資料是"持續傳輸" ( H55起始碼  H00資料 H00資料 HAA結束碼 )  ,若將comport3 RS232線移除則系統回復正常。


    請問各位版主大大,是否是開啟第二組comport 出錯  還是 comport3 不可以持續傳輸資料。

    程式碼如下

    宣告參數如下

        ''接收''

        Dim inByte As Byte
        Dim inByte_com3 As Byte

        Dim modbus_i As Integer = 0                     '//單筆資料接收次數
        Dim modbus_number_of_data As Integer = 0        '//接收 資料內容大小 byte
        Dim modbus_number_of_data_temp As Integer = 0   '//接收 資料內容大小 byte 暫存
        Dim modbus_content_of_data(1024) As Byte    '//接收單筆資料 完整儲存
        '''com 3
        Dim com_3_i As Integer = 0                     '//單筆資料接收次數
        Dim com_3_encoder_indata(256) As Byte                '//接收encoder 單筆資料 完整儲存



     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

            Try
                SerialPort1.PortName = "COM4"
                SerialPort1.BaudRate = 19200
                SerialPort1.Parity = Parity.None
                SerialPort1.DataBits = 8
                SerialPort1.StopBits = StopBits.One
                SerialPort1.Open()               '開啟串列埠
                Timer_Graphics.Enabled = True  '啟動 繪圖
            Catch ex As Exception
                MessageBox.Show("RS232-1通訊埠錯誤", "錯誤通知", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            End Try

            Try
                SerialPort3.PortName = "COM3"
                SerialPort3.BaudRate = 115200
                SerialPort3.Parity = Parity.None
                SerialPort3.DataBits = 8
                SerialPort3.StopBits = StopBits.One
                SerialPort3.Open()               '開啟串列埠
            Catch ex As Exception
                MessageBox.Show("RS232-3通訊埠錯誤", "錯誤通知", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            End Try

        End Sub


       Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived

            Dim InString As String
            InString = ""
            Dim i, len As Long

            If Not SerialPort1.IsOpen Then Exit Sub
            len = SerialPort1.BytesToRead
            If len = 0 Then Exit Sub
            For i = 0 To len
                Try
                     inByte = SerialPort1.ReadByte
                    If modbus_i >= 2 Then
                        modbus_content_of_data(modbus_i) = inByte '// 接收單筆資料 完整儲存
                        If modbus_number_of_data_temp = modbus_i Then '//接收次數 是否等於 接收資料量大小(+CRC碼)

                            If modbus_content_of_data(modbus_i) = CRC16_int_H And modbus_content_of_data(modbus_i - 1) = CRC16_int_L Then
                                Select_Command()
                            End If
                            modbus_i = 0                            '//結束接收 接收次數歸零
                        Else
                            modbus_i += 1                           '    //累加
                        End If
                    ElseIf modbus_i = 1 Then
                        modbus_number_of_data_temp = inByte               '// 接收資料量
                        modbus_i = 2
                    ElseIf modbus_i = 0 And inByte = &H1 Then
                        modbus_address = inByte                   
                         modbus_i = 1                                '//累加

                Catch ex As Exception            
                    RemoveHandler SerialPort1.DataReceived, AddressOf SerialPort1_DataReceived
                End Try
            Next
        End Sub


       Private Sub SerialPort3_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort3.DataReceived
            Dim InString As String
            InString = ""
            Dim ii, len_3 As Long

            If Not SerialPort3.IsOpen Then Exit Sub
            len_3 = SerialPort3.BytesToRead
            If len_3 = 0 Then Exit Sub
            For ii = 0 To len_3
                Try
                    inByte_com3 = SerialPort3.ReadByte

                    If com_3_i >= 3 Then
                        com_3_encoder_indata(com_3_i) = inByte_com3    '// 接收單筆資料 完整儲存

                        If com_3_encoder_indata(com_3_i) = &HAA Then '//接收次數 是否等於 接收資料量大小(+CRC碼)
                            Com3_In_VAL = (com_3_encoder_indata(1) * 256) + com_3_encoder_indata(2)

                            com_3_i = 0                            '//結束接收 接收次數歸零
                        Else
                            com_3_i += 1                           '    //累加
                            If com_3_i >= 500 Then                '   //訊號錯亂
                                com_3_i = 0                        '   //從新抓取
                            End If
                        End If
                    ElseIf com_3_i = 2 Then
                        com_3_encoder_indata(com_3_i) = inByte_com3    '// 接收單筆資料 完整儲存
                        com_3_i = 3
                    ElseIf com_3_i = 1 Then
                        com_3_encoder_indata(com_3_i) = inByte_com3    '// 接收單筆資料 完整儲存
                        com_3_i = 2                                '//累加
                    ElseIf com_3_i = 0 And inByte_com3 = &H55 Then
                        com_3_encoder_indata(com_3_i) = inByte_com3   '//接收單筆資料 完整儲存
                        com_3_i = 1                                '//累加
                    End If
                Catch ex As Exception
                    'MessageBox.Show("讀取錯誤:" + ex.ToString, "錯誤通知", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                End Try
            Next
        End Sub

    謝謝


    LEO

    2013年3月27日 上午 03:32

所有回覆

  • 只接 COM3 ?

    確認設備接地依照要求,電腦確實接地。

    兩個一起插會有問題通常是接地問題。

    2013年3月27日 上午 11:53
  • 另外,你用 DataReceived 會吃 Main Thread 的 CPU 負載,最好單獨開 Work thread 跑,並且確保 COM3 的 buffer 夠大,不然可能在你 COM1 處理完, COM3 已經因為 buffer 滿了掉訊號。

    2013年3月27日 上午 11:55
  • 謝謝 回復
    只接 COM3 ??  <-- VB2008軟體開啟兩個comport,只連結一條實體RS232線單邊com1接收指令正常,若同時接上2條實體RS232線 則會出現異常

    請問如何使用 " 單獨開 Work thread 跑 "

    表單上"SerialPort1"屬性 ReadBufferSize 設定為40960 , WriteBufferSize 設定為20480   <-加大COM3 ㄉ buffer 這樣設定正確嗎??
    謝謝


    LEO

    2013年3月28日 上午 03:30
  • 你應該先加大的是 SerialPort3 ,因為傳輸速率較快,所以緩衝區要加大。

    另外練習用 AccessPort 來錄資訊,確認是你程式沒寫好還是有雜訊,有雜訊朝接地處理,程式沒寫好朝多緒處理。

    你把程式改成開 COM1 ,編譯一次,開 COM3 編譯一次,兩隻同時跑,如果兩隻同時跑,正常,程式沒寫好朝多緒處理。

    單獨開 Thread 可以看這篇:

    http://www.dotblogs.com.tw/billchung/archive/2012/02/01/67312.aspx

    2013年3月28日 下午 02:25