Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 14.06.2020
Сообщений: 30

Обмен данными по TCP с устройством - зависает при приёме

10.05.2021, 10:49. Показов 1873. Ответов 11

Студворк — интернет-сервис помощи студентам
Возникла проблема при написании программы, которая общается с устройством в локальной сети.
На VB6 пользовался winsock. Там проблем не возникает. А на VB.net программа зависает.
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
Imports System.Net.Sockets
 
Public Class Form1
    Dim tc As TcpClient
 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        TextBox2.Text = ""
 
        Dim parts As String() = TextBox1.Text.Split(" ")
        Dim bytes(parts.Length) As Byte
 
        For i As Integer = 0 To parts.Length - 1
            bytes(i) = Convert.ToByte(parts(i), 16)
        Next
        tc = New TcpClient("192.168.1.78", 23)
        Dim ns As NetworkStream = tc.GetStream()
 
        ns.Write(bytes, 0, bytes.Length)
 
        Dim read_bytes(50) As Byte
        ns.Read(read_bytes, 0, read_bytes.Length)
        ns.Flush()
        ns.Close()
 
        For f = 0 To 26
            TextBox2.Text &= h_Hex(read_bytes(f))
        Next
 
    End Sub
    Public Function h_Hex(Text As String) As String
        If Len(Text) = 0 Then Exit Function
 
        If (Len(Hex(Text)) Mod 2) Then
            h_Hex = "0" & Hex(Text) & " "
        Else
            h_Hex = Hex(Text) & " "
        End If
 
#Disable Warning BC42105 ' Функция не возвращает значение на всех путях к коду
    End Function
 
#Enable Warning BC42105 ' Функция не возвращает значение на всех путях к коду
 
End Class
При отправке с программы запроса "FF A0 C1" устройство отдаёт 26 байт. Постоянное значение.
Если поставить запрос устройства в таймер, и опрашивать каждую секунду, программа не сразу, но зависнет на строке
VB.NET
1
ns.Read(read_bytes, 0, read_bytes.Length)
а значение read_bytes будет 51. Но устройство не может отдать больше 26 байт.

Может кто-нибудь подскажет, где у меня ошибка?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.05.2021, 10:49
Ответы с готовыми решениями:

Обмен данными с устройством через com-порт
Здравствуйте. Я работаю с Акип'ом и мне нужно считывать с него измерения. Проблема в том, что я не могу получить от него банальное имя,...

Обмен данными между устройством и внутренним сетевым ресурсом
Здравствуйте Уважаемые форумчане. Есть задача обмена данными с Android устройства и другой системой.Необходимо передать файлы с...

Сцена зависает при запуске TCP-клиента, когда он подключен к TCP - серверу, при этом TCP-клиент полностью функционирует
Проблема описана в заголовке, и хотелось бы услышать ваше мнение, о том как можно решить проблему. Скрипт TCP-клиента на сцене: ...

11
2287 / 1603 / 400
Регистрация: 26.06.2017
Сообщений: 4,753
Записей в блоге: 1
10.05.2021, 11:50
Оберните код в оператор Try Catch и посмотрите какое исключение вываливается.

Добавлено через 1 минуту
Цитата Сообщение от samego Посмотреть сообщение
а значение read_bytes будет 51
Так Вы сами определили размер буфера равный 51 байт:
Цитата Сообщение от samego Посмотреть сообщение
Dim read_bytes(50) As Byte
0
0 / 0 / 0
Регистрация: 14.06.2020
Сообщений: 30
10.05.2021, 11:54  [ТС]
Оно не вываливается, а просто зависает на строке
ns.Read(read_bytes, 0, read_bytes.Length)

Как я понимаю, переполнение переменной read_bytes.

Добавлено через 1 минуту
А как этого избежать?
0
2287 / 1603 / 400
Регистрация: 26.06.2017
Сообщений: 4,753
Записей в блоге: 1
10.05.2021, 11:57
В комментариях на NetworkStream пишут:
По умолчанию при закрытии NetworkStream не закрывается предоставленное Socket . Если требуется, чтобы у элемента NetworkStream имелось разрешение на закрытие предоставленного объекта Socket , необходимо указать true значение ownsSocket параметра.
Сколько всего сокетов можно открыть?
Цитата Сообщение от samego Посмотреть сообщение
Оно не вываливается, а просто зависает на строке
Оберните в Try, потом обсудим, что и где вываливается.
0
0 / 0 / 0
Регистрация: 14.06.2020
Сообщений: 30
10.05.2021, 12:06  [ТС]
Обернул. Ничего не поменялось.
Я это сделал как только писал код.
0
2287 / 1603 / 400
Регистрация: 26.06.2017
Сообщений: 4,753
Записей в блоге: 1
10.05.2021, 12:21
Попробуйте сделать как в примере на MSDN (с проверкой DataAvailable)

Добавлено через 8 минут
М.б. так:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Public Class Form1
    Dim tc As TcpClient
 
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Try
        TextBox2.Text = ""
 
        Dim parts As String() = TextBox1.Text.Split(" ")
        Dim bytes(parts.Length) As Byte
 
        For i As Integer = 0 To parts.Length - 1
            bytes(i) = Convert.ToByte(parts(i), 16)
        Next
 
        If tc Is Nothing Then tc = New TcpClient("192.168.1.78", 23) '!!!!!!!!!
        Dim ns As NetworkStream = tc.GetStream()
 
        ns.Write(bytes, 0, bytes.Length)
 
        Dim read_bytes(50) As Byte
 
        ns.Read(read_bytes, 0, read_bytes.Length)
        ns.Flush()
        ns.Close()
 
        For f = 0 To 26
            TextBox2.Text &= h_Hex(read_bytes(f))
        Next
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Sub
0
0 / 0 / 0
Регистрация: 14.06.2020
Сообщений: 30
10.05.2021, 12:25  [ТС]
Теперь есть ошибка: "Операция не разрешается на не подключённых сокетах"
0
2287 / 1603 / 400
Регистрация: 26.06.2017
Сообщений: 4,753
Записей в блоге: 1
10.05.2021, 16:27
samego, попробуйте так.
Кликните здесь для просмотра всего текста
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Public Class Form1
    Dim tc As TcpClient
    Dim ipEndPnt As New IPEndPoint("192.168.1.78", 23)
 
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Try
        TextBox2.Text = ""
 
        Dim parts As String() = TextBox1.Text.Split(" ")
        Dim bytes(parts.Length) As Byte
 
        For i As Integer = 0 To parts.Length - 1
            bytes(i) = Convert.ToByte(parts(i), 16)
        Next
 
        '!!!!!!!!!
        If tc Is Nothing Then tc = New TcpClient(ipEndPnt) 
        tc.Connect(ipEndPnt)
 
        Dim ns As NetworkStream = tc.GetStream()
 
        ns.Write(bytes, 0, bytes.Length)
 
        Dim read_bytes(50) As Byte
 
        ns.Read(read_bytes, 0, read_bytes.Length)
        ns.Flush()
        ns.Close()
 
        For f = 0 To 26
            TextBox2.Text &= h_Hex(read_bytes(f))
        Next
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Sub

Цитата Сообщение от samego Посмотреть сообщение
Если поставить запрос устройства в таймер, и опрашивать каждую секунду
Вопрос: зачем так делать?
0
0 / 0 / 0
Регистрация: 14.06.2020
Сообщений: 30
10.05.2021, 16:56  [ТС]
Ну делается для того, чтобы программа могла всё время опрашивать устройство. Опрос может быть не только одним форматом данных, а разными. Есть другой способ взаимодействия софта с оборудованием? Без опросов?
Ваш код не запустился. Ругается на строку Dim ipEndPnt As New IPEndPoint("192.168.1.78", 23) (приведение к типу long не допустимо).
0
2287 / 1603 / 400
Регистрация: 26.06.2017
Сообщений: 4,753
Записей в блоге: 1
10.05.2021, 17:05
Цитата Сообщение от samego Посмотреть сообщение
Ваш код не запустился.
Ну да ошибся, так будет правильнее:
VB.NET
1
Dim ipEndPnt As New IPEndPoint(IPAddress.Parse("192.168.1.78"), 23)
Цитата Сообщение от samego Посмотреть сообщение
Есть другой способ взаимодействия софта с оборудованием? Без опросов?
Не знаю.
0
0 / 0 / 0
Регистрация: 14.06.2020
Сообщений: 30
10.05.2021, 17:11  [ТС]
Ну да ошибся, так будет правильнее:
Появилась другая ошибка: Требуемый адрес для своего контекста неверен.
0
0 / 0 / 0
Регистрация: 14.06.2020
Сообщений: 30
11.05.2021, 20:21  [ТС]
Может ещё есть какие-нибудь мысли у кого-нибудь?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.05.2021, 20:21
Помогаю со студенческими работами здесь

MODBUS-TCP обмен данными
Моё простенькое чудо-приложение должно принимать/посылать данные от/на внешнее устройство. Внешнее устройство - ПЛК Овен, который...

Обмен данными клиент-сервер TCP
Доброго дня! Столкнулся с проблемкой при обмене инфой по IdTCPClient и IdTCPServer, ситуевина такая: Сервер: begin ...

Обмен данными по TCP через NAT
TCP сервер имеет доступ в инет через NAT, соответственно, на прямую к нему подключиться нельзя. Может есть какие-то сторонние сервисы,...

Tcp Сервер - Клиент обмен данными
Ситуация такая: есть Tcp клиент и сервер для xna игры. Реализован обмен объектами, которые содержатся в единой библиотеке. Объекты...

Обмен данными между Сервером и Клиентом TCP
Ребят, помогите реализовать обмен данными между Сервером и Клиентом. На данный момент, у меня есть: Клиент using System; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru