Question Comport reads errors after number of good reads...


New member
Jan 28, 2009
Programming Experience
Hi All, any input would be appreciated.

I have just dabbled with VB in the past so excuse my ignorance if you see something obvious.

I have a hardware which sends out packets containing 17 bytes to the comport in bursts of 3. the little test VB that I have written receives and displays the bytes in a line of 17 bytes long and works fine until it gets to around 170th packet, then it starts to mix up (looks like shifting the data left) the bytes shift mostly by one digit sometimes by two. Then it will continue to give almost a packet correct and a packet shifted for about 50 packets. Then it will correct itself for a long while, but then the speed at which it receives drops.

All the packets are sent 3 times, and before things go wrong (within the first 170 packets) the packet counter shows that it receives 3 packet each time but after the problem it goes to 2 packet per burst and then to one.If i close my VB monitoring program say at packet 165 and immediately open it again, it wont go wrong for another 170 packets, this points the finger at VB. I have check my hardware, there is no problem with that.

The program reads port - waits for 17 bytes - once 17 has been received it will go and buffer the packet in an array. In fact they are 2 arrays but printing fro either results in the same problem.

I have tried whatever i could think of but to no avail, i am wondering if some kind of house keeping needs to be done to clear something... I am sorry the program is a bit messy but I have been making many changes to find out what the problem is - my code

Public Class Form1

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

        'Call Display_Word()
        'checks to see if you have default com port available
        Catch ex As Exception
            MessageBox.Show("Unable To Open Comm Port")
        End Try

        N_Pkts = 1
    End Sub

    'data received event
    Private Sub SerialPort12_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort12.DataReceived

        'fires when data is received in the input buffer
        'If SerialPort12.BytesToRead < 17 Then
        '    Exit Sub
        'End If
        'number of bytes to rx before start processing
        ComByts = 16

        If SerialPort12.BytesToRead >= 17 Then
                CheckForIllegalCrossThreadCalls = False
                If SerialPort12.BytesToRead = 0 Then

                    Exit Do
                End If
        End If
        SerialP_In_Counter = 0
    End Sub
    'check incoming stream and store them in array.
    Private Sub myRxData(ByVal mydata As Integer)
        'Disables errors when calling functions from different threads
        'not the best way but suitable for our purpose.....
        CheckForIllegalCrossThreadCalls = False

        'pass the data to the array.
        Serial_Data(SerialP_In_Counter) = mydata
        If SerialP_In_Counter = ComByts Then

            'display packet numbers.
            TextBox19.Text = N_Pkts

            'go buffer data.
            Call Buffer_data()

            'go filter Word and Bytes
            'Call BW_Convert()

            'printing process.
            For PrintS_Counter As Byte = 0 To 16     'counts words (UShort)
                'TextBox1.Text &= Serial_Data(PrintS_Counter) & Chr(13) & Chr(10)
                ''TextBox1.Text &= My_Proced_Short(PrintS_Counter) & Chr(13) & Chr(10)
                'TextBox1.SelectionStart = TextBox1.TextLength
                TextBox1.Text &= SerialP_In(PrintS_Counter) & " " ' & Chr(13) & Chr(10)
                TextBox1.SelectionStart = TextBox1.TextLength
            TextBox1.Text &= Chr(13) & Chr(10)
            TextBox1.SelectionStart = TextBox1.TextLength
            'TextBox1.Text &= "========" & Chr(13) & Chr(10)
            'TextBox1.SelectionStart = TextBox1.TextLength

            'For PrintB_Counter As Byte = 0 To 2     'counts bytes

            '    TextBox18.Text &= My_Proced_Bytes(PrintB_Counter) & Chr(13) & Chr(10)
            '    TextBox18.SelectionStart = TextBox18.TextLength
            '    TextBox18.ScrollToCaret()

            'reset array counter
            SerialP_In_Counter = 0
            Array.Clear(SerialP_In, 0, 16)
            Array.Clear(Serial_Data, 0, 16)
            Exit Sub
        End If
        'if array is not filled increase it
        If SerialP_In_Counter < ComByts Then
            SerialP_In_Counter += 1

        End If
        'TextBox1.Text &= mydata '& Chr(13) & Chr(10)
    End Sub
    'buffer the live straming data in to an array.
    Sub Buffer_data()
        Dim data_counter As Integer
        For data_counter = 0 To ComByts
            SerialP_In(data_counter) = Serial_Data(data_counter)
        N_Pkts += 1

    End Sub
    'this part is not used at the moment

    'convert data stream stored in the array to Short(Word) and Bytes.
    Sub BW_Convert()
        'local counter for Word variables.
        Dim pack As Byte = 0
        'convert the first 7 Words out of 14 bytes.
        For data_counter = 0 To 13 Step 2 'step index.
            'converts the array of bytes to shorts.
            My_Proced_Short(pack) = BitConverter.ToUInt16(Serial_Data, data_counter)
            'make sure it stays within 5.
            If pack < 6 Then
                pack += 1
            End If

        ''set array to the righ index to start processing bytes 1-14 are shorts, 15-17 are bytes.
        pack = 14
        'counter for the remaining bytes.
        For data_counter = 0 To 2
            My_Proced_Bytes(data_counter) = Serial_Data(pack)
            If pack <= ComByts Then
                pack += 1
            End If
        'pack = ComByts

    End Sub

    'TX not used.
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        'type something into textbox2 to transmit
        'SerialPort12.Write(TextBox2.Text & vbCrLf)

    End Sub
    'clear veiwing textboxes.
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    End Sub
    'discard serial buffer.
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    End Sub
    'clear RTB and reset number of packets.
    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        N_Pkts = 1
    End Sub
End Class
Top Bottom