Вот такая проблема с MSCOMM
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.38] |
|
|
Правила раздела Visual Basic: Общие вопросы
FAQ Сайта
FAQ Раздела
Кладовка
Наши Исходники
API-Guide
Поиск по Разделу
MSDN Library Online
Google| Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Вот такая проблема с MSCOMM
|
Сообщ.
#1
,
|
|
|
|
Пытаюсь через MSComm работать с устройством, но сталкиваюсь с трудностями.
Устройство USB, но работа с ним осуществляется через Com, самому устройству все равно на каком порту быть, хоть на 256, а мне как быть....??? После команды MSComm1.CommPort = 25 вылетает ошибка мол Ivalid Port и тд. Хотя устройство у меня находится именно на 25-ом...? БУДУ ОЧЕНЬ БЛАГОДАРЕН ЗА ПОМОЩЬ) |
|
Сообщ.
#2
,
|
|
|
|
Цитата varzind @ MSComm1.CommPort = 25 вылетает ошибка мол Ivalid Port MSComm не может работать с портами выше 16. Надо юзать либо сторонние либы, либо CreateFile. PS: недавно было обновление бейсика в плане контролов, можно посмотреть исправила MS такое поведение или нет. |
|
Сообщ.
#3
,
|
|
|
|
Цитата nash @ PS: недавно было обновление бейсика в плане контролов, можно посмотреть исправила MS такое поведение или нет. Видал что-то вроде SP6 - это про это говоришь..?? |
|
Сообщ.
#4
,
|
|
|
|
http://msdn.microsoft.com/en-us/vbrun/ms788708.aspx - скорее я думаю про это.
А тут обновления скачать можно: http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=e27eebcb-095d-43ec-a19e-4a46e591715c http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=cb824e35-0403-45c4-9e41-459f0eb89e36 |
|
Сообщ.
#5
,
|
|
|
|
Цитата Lumen @ А тут обновления скачать можно: угу |
|
Сообщ.
#6
,
|
|
|
|
К сожалению пока не имею возможности скачать... Интернет с предоплатой траффика, а траффик-то закончился((( Спасибо, позже скачаю... Сообщу результат!
|
|
Сообщ.
#7
,
|
|
|
|
Сообщаю результат... Все обновления скачал и успешно установил, но не каких изменений с MSCom компонентом не заметил...
Цитата nash @ Надо юзать либо сторонние либы, либо CreateFile Нет ли какой известной либы, посоветуйте. И не знаю как через CreateFile работать, если есть примеры работы не откажусь |
|
Сообщ.
#8
,
|
|
|
|
![]() ![]() Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long Private Declare Function ReadFile Lib "kernel32" Alias "ReadFile" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As OVERLAPPED) As Long Private Declare Function WriteFile Lib "kernel32" Alias "WriteFile" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, lpOverlapped As OVERLAPPED) As Long Const FILE_ATTRIBUTE_TEMPORARY = &H100 Const OPEN_EXISTING = 3 Const GENERIC_READ = &H80000000 Const GENERIC_WRITE = &H40000000 ...... dim a as byte ComPort="\\.\COM25" hComm=CreateFile(ComPort, GENERIC_READ or GENERIC_WRITE, 0, 0,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0) ReadFile hComm,a,1, 1,byval &0 WriteFile hComm,a,1,1,byval &0 Вроде так... |
|
Сообщ.
#9
,
|
|
|
|
Доброго всем времени.
Дабы не плодить темы, задаю вопрос в этой. Работаю с MSCOMM. передаю на устройство массив данных. Параметры 38400,8,N,1 Блоками по 128 байт + 1 байт CRC + 1 байт конца (04). MSComm1.Output = ByteArray Перед каждой передачей очищаю буфер MSComm1.OutBufferCount = 0 Жду ответа от устройства в MSComm1_OnComm. Нормальный ответ = &hFE Ошибка = 01 Но вот иногда устройство тупо молчит. Т.е. ничего не передает в ответ! Изменял размер буфера передачи от 255 до 1024 но , приблизительно через 3-5 переданных блоков, опять молчит. Что я не так делаю? И вообще, что это за протокол такой: 04 - конец передачи блока FE - нормально принят блок (ответ от устройства) 01 - ошибка приёма блока (ответ от устройства) 03 - завершение передачи (конец файла). Может кто знает? |
|
Сообщ.
#10
,
|
|
|
|
Цитата Дабы не плодить темы, задаю вопрос в этой. Зря, лучше создать новую, тем более, Ваша тема вообще никак не связанна с этой. Цитата приблизительно через 3-5 переданных блоков, опять молчит. Если устройство программировалось не Вами - тут может быть что угодно, от обычного переполнения памяти устройства или ошибке, которая вводит устройство в "ступор", до линейной реализация ответа - ответ отправляется единожды, а не в цикле, как это следовало бы сделать, любая потеря байта и бесконечное ожидание неизвестно чего... Если всё таки есть доступ к исходному коду устройства, или исходный код Вашей программы на стороне ПК - пожалуйста, предоставьте этот код, иначе - сомневаюсь что Вам хоть кто то ответит. |
|
Сообщ.
#11
,
|
|
|
|
Цитата VisualProg @ Зря, лучше создать новую На многих форумах модеры сильно ругаются, если плодишь темы .Кода устройства нет . ... если бы был ... Я просто зациклился, надо пообщаться, может, пока буду отвечать на поставленные вопросы, решу проблему. Весь код процедуры вываливать не буду т.к. он довольно большой. Просто опишу последовательность действий. 1. Start_Process Открываю порт. 2.Передаю запрос. Запускаю таймер ожидания. (1 сек) 3.Жду ответа в MSComm1_OnComm Пришел ответ. Отключаю таймер. Перехожу на процедуру анализа принятого. DataLenCount = MSComm1.InBufferCount if DataLenCount =1 Then Проверяю принятый байт. Если FE - то передаю следующий запрос. Переход на п.2 Если 01 - повторяю запрос. ......... и так в цикле, пока все не передам. Пробовал делать задержки на Sleep - работает очень коряво, долго и периодически виснет без ответа. Тыкал куда попало DoEvents, не помогает... P.S. Для информации. Есть прога, которая все это делает, но она не моя. Написана на таком же бейсике. Декомпилил её, но ничего не понял ![]() И еще вопрос. А как правильно отправлять данные в порт? Блоками по 128 байт? Блоками по 8 байт? Побайтно? После блока задержка нужна? Сколько? (Sleep?) |
|
Сообщ.
#12
,
|
|
|
|
Много непонятного:
1) Каково назначение таймера ожидания, если поступление данных поднимает событие порта, и их здесь-же можно анализировать? 2) ![]() ![]() if DataLenCount =1 Then 3) Если по нормальному, нужно было бы минимизировать и показать проблемный код, а так-же указать девайс, возможно прикрепить, или дать ссылку на мануал. Как порту становится известно, что ожидаемый пакет данных сформирован корректно и получен им полностью? - возможно отсутствие ответа - банальное ожидание продолжения поступления данных? |
|
Сообщ.
#13
,
|
|
|
|
Цитата Запускаю таймер ожидания. (1 сек) этот пункт как минимум вызывает подозрение...Цитата Пробовал делать задержки на Sleep Он и должен тормозить, сама передача могла бы быть в параллельном потоке, тогда всё было бы гладко, ровно как вам и надо, но, есть нюанс - VB и многопоточность несовместимы Думаю из-за пункта с таймером, вы считываете произвольные данные в случайный момент времени, а не реально прибывшие данные, ну, это имхо, могу ошибаться. Вообще, по хорошему, надо было бы подписаться на слушателя порта у контролла, либо, если есть, посмотреть на Event-ы, поискать каких нибудь DataReceiveEvent/DataSendEvent или нечто похожее. А то ваша система очень напоминает велосипед с треугольными колёсами, из-за которых, кстати, sleep и тормозит |
|
Сообщ.
#14
,
|
|
|
|
Попробую ответить на оба сообщения
.Цитата hclubmk @ Каково назначение таймера ожидания Таймер просто сообщает мне (Timer 1..2..3..4..), что я жду ответа. В событии таймера стоит счетчик, если прошло 15 событий дальше ждать нечего, завершаем процедуру. Других целей у него нет. Цитата hclubmk @ Порт точно работает в асинхронном режиме А где это переключается? Цитата hclubmk @ показать проблемный код, а так-же указать девайс, возможно прикрепить, или дать ссылку на мануал. О коде см. мой пост выше. Мануал на 1142 страницы в пдфе. Будете изучать? И самое прикольное,(вы наверно не удивитесь) что это, недокументированные свойства! В мануале нет ни слова про это .Цитата hclubmk @ Как порту становится известно, что ожидаемый пакет данных сформирован корректно и получен им полностью? По отправке контр. суммы блока и команде завершения передачи блока(04). Цитата hclubmk @ - возможно отсутствие ответа - банальное ожидание продолжения поступления данных? Возможно. Тут я сам не знаю .Цитата VisualProg @ Он и должен тормозить, сама передача могла бы быть в параллельном потоке, тогда всё было бы гладко, ровно как вам и надо, но, есть нюанс - VB и многопоточность несовместимы А как тут может помочь DoEvents ? Цитата VisualProg @ подписаться на слушателя порта у контролла Смотрю прием/передачу порта с помощью EltimaSoftware Serial Port Monitor. Вот там и вижу тишину. Цитата VisualProg @ система очень напоминает велосипед с треугольными колёсами, Так я про это и сам понимаю , потому и тут... Цитата VisualProg @ из-за которых, кстати, sleep и тормозит Так я его и ставлю, чтобы тормозило. Иначе вообще никак. И в завершение. Ваши вопросы натолкнули на мысль. Надо переварить и попробовать. |
|
Сообщ.
#15
,
|
|
|
|
Цитата GeoSoftUa @ См. Структура COMMTIMEOUTS + А где это переключается? ![]() ![]() Public Declare Function SetCommTimeouts Lib "kernel32" (ByVal hFile As Long, lpCommTimeouts As COMMTIMEOUTS) As Long |