Форум программистов, компьютерный форум, киберфорум
Pure Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/21: Рейтинг темы: голосов - 21, средняя оценка - 4.76
1 / 1 / 0
Регистрация: 22.01.2016
Сообщений: 39

Заморочка с пересылкой данных в порт

20.03.2016, 14:03. Показов 4555. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые!
Нужно передать строку данных длиной 11 байт в Сом-порт. В строке есть нулевые байты.

WriteSerialPortString(5,Chr($10)+Chr($01 )+Chr($52)+Chr($00)+Chr($00)+Chr($00)+Ch r($00)+Chr($00)+Chr($00)+Chr($53)+Chr($1 6));

На контроле порта эти нули исчезают, передаётся всего 5 байт: "10 01 52 53 16"
Всяко извращался, ну никак! Чего я не понимаю?

PB v. 5.40 LTS(x86)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.03.2016, 14:03
Ответы с готовыми решениями:

Проблема с пересылкой данных форме
Подскажите, как грамотно сделать такую фишку: на форме 2 комбобокса. В 1-ом из бд (sql server 2000) номера контрактов из таблицы...

Проблема с пересылкой Mime
Есть кнопка, при нажатии на которую, письмо отправляется на эл. почту кнопка Dim session As New NotesSession Dim db As...

Помогите с пересылкой movsb
Нужно написать фрагмент программы, отвечающий за перемещение байт в строке, с использованием команды movsb. А конкретно дано arr db...

17
Эксперт по электронике
6493 / 3123 / 331
Регистрация: 28.10.2011
Сообщений: 12,277
Записей в блоге: 7
20.03.2016, 14:16
Для таких случаев, предназначена функция WriteSerialPortData() Данные можно поместить в массив.
PureBasic
1
2
3
4
5
6
7
8
9
Dim Buff.a(10)
 
Buff(0) = $10
Buff(1) = $01
Buff(2) = $52
Buff(9) = $53
Buff(10) = $16
 
WriteSerialPortData(5, @Buff(), 10)
А если они неизменяемые, то можно и в секцию данных.
PureBasic
1
2
3
4
5
6
7
WriteSerialPortData(5, ?m1, ?m2-?m1)
 
DataSection
  m1:
  Data.a $10, $01, $52, $00, $00, $00, $00, $00, $00, $53, $16
  m2:
EndDataSection
1
1 / 1 / 0
Регистрация: 22.01.2016
Сообщений: 39
20.03.2016, 15:45  [ТС]
Спасибо! Не ожидал такой быстрой реакции. Я не профи-программист (пенсионер, хотя и работал радиофизика-электроника), но вроде, кое-что получается. Бейсики , начиная с самодельного РК-86, VB-6, итд, мне как-то понятнее, тем более PB очень хорошо развивается, и возможности растут.
Спасибо.

Добавлено через 53 минуты
Продолжаются мои заоморочки
данные уходят нормально ( в
Цитата Сообщение от locm Посмотреть сообщение
WriteSerialPortData(5, @Buff(), 10
) последняя цифра 11, не с нуля считает, наверное, длину, экспериментально нашёл.
А вот, с приёмом (после этой посылки нужно получить ответ 16 байт) - никак, в смысле нет ответа.
Аналогичный запрос, ту же HEX-строку посылаю терминалом (CoolTerm v1.44) - ответ через 0,017 с. Т.е. устройство нормально реагирует на запрос.
Кстати, если подскажете как принять c помощью ReadSerialPortData, буду благодарен.
Мне, в дальнейшем нужно получить строковую переменную из этих 16 принятых байт.
Спасибо за участие-учение .
0
Эксперт по электронике
6493 / 3123 / 331
Регистрация: 28.10.2011
Сообщений: 12,277
Записей в блоге: 7
20.03.2016, 16:35
Цитата Сообщение от Disilly Посмотреть сообщение
последняя цифра 11, не с нуля считает, наверное, длину, экспериментально нашёл.
Да, это я ошибся. Длина должна быть 11.

Цитата Сообщение от Disilly Посмотреть сообщение
А вот, с приёмом (после этой посылки нужно получить ответ 16 байт) - никак, в смысле нет ответа.
Какой код приема?
0
1 / 1 / 0
Регистрация: 22.01.2016
Сообщений: 39
20.03.2016, 16:46  [ТС]
Я смотрю внешним сниффером FreeSerialPortMonitor. Терминалу есть ответ,
Эту строку данных моя прога теперь корректно посылает (там же вижу), а ответ только терминалу.
Может дело в каких-то задержках? Порт открывается-закрывется нормально(тот же сниффер видит):
OpenSerialPort(5, "COM5", 9600, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 256, 256)

Добавлено через 3 минуты
Собственно, вот тренировочный кусочек
PureBasic
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
45
46
47
48
49
50
 OpenWindow(0, 0, 0, 240, 210, "OptionGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  Debug FormatDate("%hhч %iiмин",Date())
  ButtonGadget(2,5,5,30,30,"}{")
  stroka.s="1001520000000000005316"
  ;---------------------
  Procedure nazato()
Dim Buff.a(10)
 
Buff(0) = $10
Buff(1) = $01
Buff(2) = $52
Buff(3) = $00
Buff(4) = $00
Buff(5) = $00
Buff(6) = $00
Buff(7) = $00
Buff(8) = $00
Buff(9) = $53
Buff(10) = $16
 
WriteSerialPortData(5, @Buff(), 11) 
;=========
ReadSerialPortData(5,*buff,32)
Debug buff
 
  EndProcedure
 ;-------------------------------------------------- 
  OpenSerialPort(5, "COM5", 9600, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 256, 256)
  lens=Len(stroka)
 ;Debug lens   
;EndIf 
;----------------------------------
Repeat 
     event=WaitWindowEvent() 
  If event = #PB_Event_Gadget   ;Дожидаемся события именно в гаджете.
  Debug event
  Select  EventGadget(); =ButtonGadget(2)
   Case 2
     Debug "Nazato"
     nazato() 
 
 EndSelect
 
  EndIf   
Until  Event = #PB_Event_CloseWindow
CloseSerialPort(5)
 
End 
 
;EndIf
Быстренько накидал, чтобы потом вставить в основную разработку (без кнопок-окон, конечно))
0
Эксперт по электронике
6493 / 3123 / 331
Регистрация: 28.10.2011
Сообщений: 12,277
Записей в блоге: 7
20.03.2016, 17:11
Цитата Сообщение от Disilly Посмотреть сообщение
Я смотрю внешним сниффером FreeSerialPortMonitor. Терминалу есть ответ,
Возможно теримнал отправляет в другом формате. Не помешал бы скрин данных (запрос и ответ) в FreeSerialPortMonitor.

Цитата Сообщение от Disilly Посмотреть сообщение
Собственно, вот тренировочный кусочек
Так прием работать не будет. Переменной *buff в коде нет и ее размер точно не 32 байта. Ответ придет не моментально, а через некоторое время. В простейшем случае код будет такой.
PureBasic
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
Procedure nazato()
  Dim Buff.a(32)
  
  Buff(0) = $10
  Buff(1) = $01
  Buff(2) = $52
  Buff(3) = $00
  Buff(4) = $00
  Buff(5) = $00
  Buff(6) = $00
  Buff(7) = $00
  Buff(8) = $00
  Buff(9) = $53
  Buff(10) = $16
  
  WriteSerialPortData(5, @Buff(), 11)
  
  Delay(1000) ; Ждем секунду ответ.
  
  Count = AvailableSerialPortInput(5)
  If Count>=32
    FillMemory(@Buff(), ArraySize(Buff())+1, 0) ; Обнуление массива
    Count = ReadSerialPortData(5, @Buff(), 32)
    Debug "Принято "+Count+" байт"
    ShowMemoryViewer(@Buff(), Count)
  Else
    Debug "Принято "+Count+" байт"
  EndIf
  
EndProcedure
0
1 / 1 / 0
Регистрация: 22.01.2016
Сообщений: 39
20.03.2016, 17:37  [ТС]
Iocm,
Вот картинка сниффера вначале CoolTerm затем программа.
По приёму у меня там ерунда - не разбирался ещё, просто забросил оператор. За подсказку спасибо.
Миниатюры
Заморочка с пересылкой данных в порт  
0
1 / 1 / 0
Регистрация: 22.01.2016
Сообщений: 39
20.03.2016, 18:00  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
ShowMemoryViewer(@Buff(), Count)
* Else
* * Debug "Принято "+Count+" байт"
Вот этот фрагмент показывает,что принято 13 байт! Но как их вытащить из буфера и в строку преобразовать? Кстати, сниффер приём не видит!
0
Эксперт по электронике
6493 / 3123 / 331
Регистрация: 28.10.2011
Сообщений: 12,277
Записей в блоге: 7
20.03.2016, 18:31
PureBasic
1
2
3
4
5
6
7
8
9
  Count = AvailableSerialPortInput(5)
  If Count>0 And Count<=32
    FillMemory(@Buff(), ArraySize(Buff())+1, 0) ; Обнуление массива
    Count = ReadSerialPortData(5, @Buff(), Count)
    Debug "Принято "+Count+" байт"
    ShowMemoryViewer(@Buff(), Count)
  Else
    Debug "Принято "+Count+" байт"
  EndIf
0
1 / 1 / 0
Регистрация: 22.01.2016
Сообщений: 39
20.03.2016, 18:56  [ТС]
Да, теперь ShowMemoryViewer показывает 13 принятых байт! То есть реакция есть, но...
Как эти 13 байт присвоить строковой переменной? Последняя, надеюсь, заморочка
И, всё-таки, почему-то сниффер её не видит, что меня и смущало...
0
Эксперт по электронике
6493 / 3123 / 331
Регистрация: 28.10.2011
Сообщений: 12,277
Записей в блоге: 7
20.03.2016, 19:14
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  Count = AvailableSerialPortInput(5)
  If Count>0 And Count<=32
    FillMemory(@Buff(), ArraySize(Buff())+1, 0) ; Обнуление массива
    Count = ReadSerialPortData(5, @Buff(), Count)
    Debug "Принято "+Count+" байт"
    ShowMemoryViewer(@Buff(), Count)
    
    s.s=""
    
    For i=0 To Count
      s + RSet(Hex(Buff(i), #PB_Ascii), 2, "0")+" "
    Next
    
    Debug s
    
  Else
    Debug "Принято "+Count+" байт"
  EndIf
0
1 / 1 / 0
Регистрация: 22.01.2016
Сообщений: 39
20.03.2016, 19:36  [ТС]
[19:31:20] Ожидание запуска исполняемого файла...
[19:31:20] Тип исполняемого файла: Windows - x86 (32bit)
[19:31:20] Запущен исполняемый файл.
[19:31:24] [ОШИБКА] трен3.pb (Строка: 36)
[19:31:24] [ОШИБКА] Индекс массива вне допустимых границ.
[19:31:28] Программа уничтожена.

Вот что-то с индексами. Но, оказывается из буфера надо побайтно считывать, что я, конечно не знал...
RSet не очень понятно в хелпе, да и вообще он скудный, примеров (что важно) маловато..
Вот ещё с этой "заморочкой" индексной разобраться бы.... А в целом, Вам Iocm, огромное спасибо!
Строка 36 - s + RSet(Hex(Buff(13), #PB_Ascii), 2, "0")+" "
0
Эксперт по электронике
6493 / 3123 / 331
Регистрация: 28.10.2011
Сообщений: 12,277
Записей в блоге: 7
20.03.2016, 19:46
Размер массива какой? 32 байта или меньше?

Цитата Сообщение от Disilly Посмотреть сообщение
RSet не очень понятно в хелпе
Функция добавляет определенные количество символов в строку (в данном случае символ 0) если строка короче чем заданно (в данном случае 2 символа). Нужно для форматирования строки. Это необязательно и зависит от того что нужно получить в конечном итоге.

В коде должно быть.
PureBasic
1
2
3
    For i=0 To Count - 1
      s + RSet(Hex(Buff(i), #PB_Ascii), 2, "0")+" "
    Next
0
1 / 1 / 0
Регистрация: 22.01.2016
Сообщений: 39
20.03.2016, 20:01  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
For i=0 To Count - 1
* * * s + RSet(Hex(Buff(i), #PB_Ascii), 2, "0")+" "
* * Next
байты в памяти есть и то, что нужно. А Этот цикл гонял всяко. С фиксированyым числом i и по count - ошибка индекса, программа висит на 11 байте - там 00, хотя этот же 00 также и 5
Вот что в памяти: 0156FCD0 10 01 52 90 00 D2 E8 33 22 24 00 16 16 ..R.Òè3"$...
на debug выводится 10 01 52 90 D2 E8 33 22 24 0 - последний именно один ноль!
И висит....
0
Эксперт по электронике
6493 / 3123 / 331
Регистрация: 28.10.2011
Сообщений: 12,277
Записей в блоге: 7
20.03.2016, 20:05
Цитата Сообщение от Disilly Посмотреть сообщение
программа висит на 11 байте
В этом коде размер массива 33 байта. Заморочка с пересылкой данных в порт
1
1 / 1 / 0
Регистрация: 22.01.2016
Сообщений: 39
20.03.2016, 21:52  [ТС]
Ставил принудительно цикл на 33 и т.д.
Debug строки внутрь цикла вот что имеем:
Принято 13 байт
10
10 01
10 01 52
10 01 52 90
10 01 52 90 00
10 01 52 90 00 E4
10 01 52 90 00 E4 21
10 01 52 90 00 E4 21 96
10 01 52 90 00 E4 21 96 21
10 01 52 90 00 E4 21 96 21 24
10 01 52 90 00 E4 21 96 21 24 00
И висим... Содержимое строки (данных) каждый раз разное.
Кажется, для воскресенья ужо хватит.. Спасибо, продвинулся значительно, практически до финиша...
Остальное основное оформление и математику написал раньше.

Добавлено через 59 минут
Не удержался - попробовал это на PB v 4.51
[21:12:43] [ОШИБКА] Указатель массива больше допустимого диапазона.

Добавлено через 36 минут
Цитата Сообщение от locm Посмотреть сообщение
Dim Buff.a(10)
Всё, разобрался! Там вначале массив был объявлен!!!
Усну спокойнее!
Спасибо Iocm!
0
Эксперт по электронике
6493 / 3123 / 331
Регистрация: 28.10.2011
Сообщений: 12,277
Записей в блоге: 7
20.03.2016, 22:30
Цитата Сообщение от Disilly Посмотреть сообщение
Dim Buff.a(10)
Я об этом писал.
Цитата Сообщение от locm Посмотреть сообщение
В этом коде размер массива 33 байта. Заморочка с пересылкой данных в порт
0
1 / 1 / 0
Регистрация: 22.01.2016
Сообщений: 39
21.03.2016, 11:34  [ТС]
Да, спасибо разобрался. Тут либо новый массив для приёма, либо использовать ReDim.
Вопрос закрыт.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.03.2016, 11:34
Помогаю со студенческими работами здесь

Проблема с пересылкой вложений
Имеем почту на сервере 6.5.5 и клиенты версии 6.5.1. Пользователь пересылает письма с вложением и имеет следующую проблему: Уже при...

Проблема с пересылкой почты из Lotus
Еще вопрос по Lotus от не специалиста При пересылке письма с Лотус на другой почтовый сервер строка mail from:&lt;&gt; пустая. ...

Исправить программу с пересылкой битов
Разработайте программу пересылки блока битов из одной битовой строки (bit_str2 dd 012345678h) в другую (bit_str1 dd 0abcdefabh). В...

Разобрать с пересылкой готовой картинкой с сервера к пользователю
Здравствуйте! У меня тут проблема: 1).Мне надо на стороне клиента запросить ASP - файл, 2). Сценарий на стороне сервера(тот файл...

Заморочка с стилем
Всем привет!!! Ребята подскажите как правильно сделать ссылку-картинку. Вот часть кода с файла стилей: /* Menu */ #menu...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru