Member 10701091 Ответов: 2

Связь через последовательный порт очень медленная


Public Shared Function ReceiveData() As String
            Dim RXCnt As Integer = 0
            Dim RXByte As Byte = 0
            Dim reply As String = String.Empty
            Dim STX As Byte() = {&H2, &HD}
            Dim hexwrite As String = String.Empty
            Dim ack As Double = 0
            Dim errorCode As String = Nothing
            Dim strText As String = Nothing
            Dim RXArray As Char() = New Char(2047) {}
            Dim errorDescription = String.Empty

            Dim LookUpTable As String = "0123456789ABCDEF"

            Do
                '----- Start of communication protocol handling ---------------------------------------------

                RXCnt = 0
                Do
                    RXByte = COMPort.ReadByte

                    RXArray(RXCnt) = LookUpTable(RXByte >> 4) ' Convert each byte to two hexadecimal characters

                    RXCnt = RXCnt + 1
                    RXArray(RXCnt) = LookUpTable(RXByte And 15)
                    RXCnt = RXCnt + 1

                Loop While Not ((COMPort.BytesToRead = 0))

                '----- End of communication protocol handling -------------------------------------------------------------

                recievesend = False

                reply = RXArray(0).ToString & RXArray(1).ToString

                If reply = "06" Then
                    If readwrite = True Then

                        Try
                            COMPort.Write(STX, 0, STX.Length)
                        Catch ex As TimeoutException
                            errorCodeText = String.Concat(errorCodeText, ex.Message)
                        Catch ex As InvalidOperationException
                            errorCodeText = String.Concat(errorCodeText, ex.Message)
                        Catch ex As UnauthorizedAccessException
                            errorCodeText = String.Concat(errorCodeText, ex.Message)
                        End Try

                        recievesend = True
                        hexwrite = "020D"
                    ElseIf readwrite = False Then
                        If ack < 1 Then
                            ack = ack + 1

                            Try
                                COMPort.Write(writebytes, 0, writebytes.Length)
                            Catch ex As TimeoutException
                                errorCodeText = String.Concat(errorCodeText, ex.Message)
                            Catch ex As InvalidOperationException
                                errorCodeText = String.Concat(errorCodeText, ex.Message)
                            Catch ex As UnauthorizedAccessException
                                errorCodeText = String.Concat(errorCodeText, ex.Message)
                            End Try

                            recievesend = True
                            hexstring = StringToHex(writedata)
                        Else
                            ack = 0
                        End If
                    End If
                ElseIf reply = "15" Then
                    errorCode = RXArray(3).ToString()
                End If
                Thread.Sleep(300) 'sleep between incoming bytes
            Loop While Not ((COMPort.BytesToRead = 0))

		strText = New String(RXArray, 0, RXCnt) & vbCrLf

            Return DecodeHexString(strText)

        End Function


Что я уже пробовал:

Этот код, который я использую для чтения данных из порта, очень медленный, пожалуйста, помогите мне, если есть какие-то новые варианты, чтобы попытаться ускорить чтение.

0x01AA

У тебя есть Sleep(300)...

Member 10701091

Да, если я удаляю спящий режим, то устройство читается слишком быстро, что приводит к тому, что оно не читает никаких байтов с устройства.

0x01AA

Я не имею в виду удалить его, но, возможно, сделать его чем-то меньшим, чем 300, то есть 20, чтобы проверить, немного ли это улучшает скорость.

Member 10701091

Он работает, если его больше 200

2 Ответов

Рейтинг:
6

Patrice T

Цитата:
Этот код, который я использую для чтения данных из порта, очень медленный
По замыслу, связь через последовательный порт очень медленная.
На реальном последовательном порту максимальная скорость составляет 115200 бод, что означает 11520 символов в секунду при непрерывном потоке.

Какова ваша фактическая скорость в бодах и сколько символов в секунду вы получаете ?


Member 10701091

Это моя настройка для чтения порта

Скорость передачи = 9600
DataBits = 8
Рукопожатие = Рукопожатие.Нет
Паритет = Равенство.Нет
StopBits = StopBits.Один
WriteTimeOut = 1000
ReadTimeOut = 1000

Patrice T

Вы можете ожидать 960 символов в секунду с максимальной скоростью.

Рейтинг:
18

OriginalGriff

Вероятно, нет : последовательные порты работают с фиксированной скоростью (известной как скорость передачи данных), которая управляет максимальной скоростью, с которой символы могут передаваться между подключенными к нему устройствами. Если ваш последовательный порт установлен на 9600 бод, то вы можете передавать до 960 символов в секунду (примерно) и не более.


Member 10701091

Это моя настройка для чтения порта

Скорость передачи = 9600
DataBits = 8
Рукопожатие = Рукопожатие.Нет
Паритет = Равенство.Нет
StopBits = StopBits.Один
WriteTimeOut = 1000
ReadTimeOut = 1000

OriginalGriff

Итак ... 9600 бод, 8 БПК, четности нет, один СБ.
Это около 1000 символов в секунду-и именно поэтому ваши данные медленны...
Вы ничего не можете с этим поделать, если эти параметры соответствуют ожиданиям другого конечного устройства.

Member 10701091

Существуют ли какие-либо рекомендуемые настройки для ускорения чтения.

OriginalGriff

Извините, но нет. Это "физический предел" в том смысле, что 9600 бод-это скорость, с которой разговаривают два устройства. А это значит, что они могут передавать 9600 бит информации в секунду, не больше.
И каждый символ занимает 8 бит данных, плюс начальный бит и стоп-бит, так что это 10 бит на символ, а это означает в лучшем случае до 960 символов в секунду.
Если вы можете перенастроить удаленное устройство для использования более высокой скорости, то вы могли бы улучшить это, но есть ограничение на последовательные порты, которое составляет 115200 бод или 11 520 символов в секунду-если и только если удаленное устройство может это сделать, что будет зависеть от устройства.

Member 10701091

Устройство может принять скорость передачи данных 57600, если это улучшится.

OriginalGriff

Да, это в 6 раз быстрее, так что это даст вам около 5760 символов в секунду.