Вверх ↑
Этот топик читают: Гость
Ответов: 22
Рейтинг: 0
#1: 2013-03-21 21:42:26 ЛС | профиль | цитата
Для отладки нужно послать пару команд на сом порт и прочитать двочиные данные.
Выполняю сброс и чтение 1 байта с сом порта и получаю 0 при том , что передачи с другой стороны не было. Проверил в гипертерминале.
Вот код , немного длинноват, но интересует только ветка чтения.
code_30640.txt
Как правильно прочитать сом порт и записать побайтно (двоичные данные) в файл?

карма: 0

0
файлы: 1code_30640.txt [4.4KB] [189]
Ответов: 8959
Рейтинг: 824
#2: 2013-03-21 22:40:15 ЛС | профиль | цитата
alecsvg,
СОМ.ini писал(а):
onRead=В случае успешного чтения выдает прочитанную строку байт

А в DataToFile выбран тип данных dtByte надо или то, или то привести в соответствие
карма: 19

0
Ответов: 22
Рейтинг: 0
#3: 2013-03-21 23:07:53 ЛС | профиль | цитата
Ничего не понял. Данных нет, а сом порт генерирует ноль при чтении?
И где прячется событие тайм аута?


карма: 0

0
Разработчик
Ответов: 26305
Рейтинг: 2146
#4: 2013-03-21 23:34:23 ЛС | профиль | цитата
alecsvg писал(а):
Данных нет, а сом порт генерирует ноль при чтении?

Не ноль, а пустую строку, те "пусто" в байтовом представлении. При попытке читать принудительно буфер COM-порта, если он пустой, то всегда будет выдаваться пустая строка. Кстати, ее можно использовать для синхронизации приема данных. Если не хочется самому заморачиваться с синхронизацией порта, то тогда нужен компонент COMEX, он должен быть доступен в последних обновлениях или на SVN. Этот компонент представляет собой асинхронный порт, чтение данных у которого происходит автоматически. Но надо не забыть внимательно прочитать описания к выходным точкам
карма: 22

0
Ответов: 22
Рейтинг: 0
#5: 2013-03-22 08:34:34 ЛС | профиль | цитата
Пожалуйста , укажите это свойство в этом компоненте. Жалко потерянного часа из-за фразы "В случае успешного чтения возвращает в поток данные ". К примеру , добавить "в противном случае NULL".
Спасибо за секретный компонент, возможно, использую. Не понимая почему его не вставили в сборку 4.04. Но начну с того в чем уверен - API W2K, Hi ASMу только
графический интерфейс для удобства тестирования моему хозяину.
Компонентом COMEX планирую воспользоваться для тестирования параметров порта - паритет, количество стоп битов,разные скорости. Это возможно ?


карма: 0

0
Ответов: 9906
Рейтинг: 351
#6: 2013-03-22 10:22:58 ЛС | профиль | цитата
nesco, я давно тебя хотел спросить - что является разделителем пакетов.
Грубо говоря - где взять (и возможно ли это теоретически) Idle Detected

Если знаешь, конечно
карма: 9

0
Ответов: 22
Рейтинг: 0
#7: 2013-03-22 11:06:09 ЛС | профиль | цитата
Вдогонку еще один вопрос, если порт сом занят другим приложением или его нет, то что делать ?

карма: 0

0
Разработчик
Ответов: 26305
Рейтинг: 2146
#8: 2013-03-22 11:19:10 ЛС | профиль | цитата
Galkov писал(а):
что является разделителем пакетов

Любая ошибка состояния линии, включая ошибку передачи кадра. Ловится битом EV_ERR в lpEvtMask функции WaitCommEvent. Реализация этой функции есть в COMEX, но там ловится приход символа, аналогично можно поймать и ошибку передачи кадра.
------------ Дoбавленo в 11.19:
alecsvg писал(а):
то что делать ?

Проверить список доступных пустых портов. Есть для этого специальный компонент -- EnumCOM
карма: 22

0
Ответов: 22
Рейтинг: 0
#9: 2013-03-22 11:26:54 ЛС | профиль | цитата
Проверил. COMEX читает и выдает строку. Если напрямую слать в файловый поток с параметром Dtbyte получаю 0 а строки нет. Если параметром dtAnsiString то нужная строка с лишним 0 (признак конца строки).
Плиз дайте схему как данные с COMEX писать в файл через файловый поток.
карма: 0

0
Разработчик
Ответов: 26305
Рейтинг: 2146
#10: 2013-03-22 11:30:01 ЛС | профиль | цитата
alecsvg писал(а):
в файл через файловый поток

Использовать конверторы StreamToStr -- из файла в порт и StrToStream -- из порта в файл

Add(StreamConvertor,16690318,133,105)
{
Mode=6
}
Add(StreamConvertor,194264,133,147)
{
Mode=7
}


alecsvg писал(а):
Если параметром dtAnsiString

В штатном компоненте COMEX нет такого свойства. Нештатные компоненты к расмотрению не принимаются и по ним помощь не оказывается, если этого не соизволит сделать автор компонента
карма: 22

0
Ответов: 22
Рейтинг: 0
#11: 2013-03-22 11:54:24 ЛС | профиль | цитата
Я имел в виду компонент файловый поток (DataToFile) и его свойства.
Проверил, уже легче, только зачем мне СOMEX "0D0A" лепит? Я это не заказывал.

карма: 0

0
Ответов: 9906
Рейтинг: 351
#12: 2013-03-22 11:58:45 ЛС | профиль | цитата
nesco писал(а):
Любая ошибка состояния линии, включая ошибку передачи кадра. Ловится битом EV_ERR в lpEvtMask функции WaitCommEvent


Ты не понял, наверное. Idle Detected не является ошибкой. MSDN я, конечно же -- читал. Коды видел. Просто словов нужных не нашел.
Спросил - может ты сталкивался.

Вообще-то, Idle Detected - самый нужный сигнал, если ты живешь не в стране "лохотрония". Он означает наличие единицы на линии, длительностью длиннее символа.
Это единственное условие, после которого гарантируется правильное фазирование старт-импульса на приемнике и передатчике.
Ну и есть протоколы (не придуманные мной, а данные свыше), в которых как раз пауза между символами и является разграничителем пакетов.

Вот я не знаю заранее (в этих протоколах) какой длины мне придет пакет - как мне его вытащить и порта...
карма: 9

0
Разработчик
Ответов: 26305
Рейтинг: 2146
#13: 2013-03-22 12:04:45 ЛС | профиль | цитата
alecsvg писал(а):
Я это не заказывал

Он ничего не лепит сам, что передается в линию порта, то там и принимается, сами по себе эти символы не появляются.

карма: 22

0
Ответов: 22
Рейтинг: 0
#14: 2013-03-22 12:09:38 ЛС | профиль | цитата
Я сам передаю данные в порт. И в гипертерминале их нет. Тайм аут здесь ни при чем?
карма: 0

0
Разработчик
Ответов: 26305
Рейтинг: 2146
#15: 2013-03-22 12:22:13 ЛС | профиль | цитата
Galkov писал(а):
Спросил - может ты сталкивался

Не, с таким сигналом не сталкивался, тем более, в MSDN. Есть ли вообще в API поддержка этого сигнала напрямую

Galkov писал(а):
Вот я не знаю заранее (в этих протоколах) какой длины мне придет пакет - как мне его вытащить и порта...

А поддерживает ли UART это сигнал, если поддерживает, то наверняка выдает что-то стандартное типа разрыва линии или ошибки передачи кадра
------------ Дoбавленo в 12.22:
alecsvg писал(а):
Я сам передаю данные в порт. И в гипертерминале их нет

А для передачи Enter нажимаешь, так вот "0D0A" это и есть Enter и таймауты здесь не причем. В буфер чтения не попадает ничего само по себе, только то, что ему передают
карма: 22

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)