Для отладки нужно послать пару команд на сом порт и прочитать двочиные данные.
Выполняю сброс и чтение 1 байта с сом порта и получаю 0 при том , что передачи с другой стороны не было. Проверил в гипертерминале.
Вот код , немного длинноват, но интересует только ветка чтения.
code_30640.txt
Как правильно прочитать сом порт и записать побайтно (двоичные данные) в файл?
Этот топик читают: Гость
Ответов: 22
Рейтинг: 0
|
|||
карма: 0 |
| ||
файлы: 1 | code_30640.txt [4.4KB] [189] |
Ответов: 8959
Рейтинг: 824
|
|||
alecsvg,
СОМ.ini писал(а): onRead=В случае успешного чтения выдает прочитанную строку байтА в DataToFile выбран тип данных dtByte надо или то, или то привести в соответствие ![]() |
|||
карма: 19 |
|
Ответов: 22
Рейтинг: 0
|
|||
Ничего не понял. Данных нет, а сом порт генерирует ноль при чтении?
И где прячется событие тайм аута? |
|||
карма: 0 |
|
Разработчик
Ответов: 26305
Рейтинг: 2146
|
|||
alecsvg писал(а): Данных нет, а сом порт генерирует ноль при чтении?Не ноль, а пустую строку, те "пусто" в байтовом представлении. При попытке читать принудительно буфер COM-порта, если он пустой, то всегда будет выдаваться пустая строка. Кстати, ее можно использовать для синхронизации приема данных. Если не хочется самому заморачиваться с синхронизацией порта, то тогда нужен компонент COMEX, он должен быть доступен в последних обновлениях или на SVN. Этот компонент представляет собой асинхронный порт, чтение данных у которого происходит автоматически. Но надо не забыть внимательно прочитать описания к выходным точкам |
|||
карма: 22 |
|
Ответов: 22
Рейтинг: 0
|
|||
Пожалуйста , укажите это свойство в этом компоненте. Жалко потерянного часа из-за фразы "В случае успешного чтения возвращает в поток данные ". К примеру , добавить "в противном случае NULL".
Спасибо за секретный компонент, возможно, использую. Не понимая почему его не вставили в сборку 4.04. Но начну с того в чем уверен - API W2K, Hi ASMу только графический интерфейс для удобства тестирования моему хозяину. Компонентом COMEX планирую воспользоваться для тестирования параметров порта - паритет, количество стоп битов,разные скорости. Это возможно ? |
|||
карма: 0 |
|
Ответов: 9906
Рейтинг: 351
|
|||
nesco, я давно тебя хотел спросить - что является разделителем пакетов.
Грубо говоря - где взять (и возможно ли это теоретически) Idle Detected Если знаешь, конечно |
|||
карма: 9 |
|
Ответов: 22
Рейтинг: 0
|
|||
Вдогонку еще один вопрос, если порт сом занят другим приложением или его нет, то что делать ?
|
|||
карма: 0 |
|
Разработчик
Ответов: 26305
Рейтинг: 2146
|
|||
Galkov писал(а): что является разделителем пакетовЛюбая ошибка состояния линии, включая ошибку передачи кадра. Ловится битом EV_ERR в lpEvtMask функции WaitCommEvent. Реализация этой функции есть в COMEX, но там ловится приход символа, аналогично можно поймать и ошибку передачи кадра. ------------ Дoбавленo в 11.19: alecsvg писал(а): то что делать ?Проверить список доступных пустых портов. Есть для этого специальный компонент -- EnumCOM |
|||
карма: 22 |
|
Ответов: 22
Рейтинг: 0
|
|||
Проверил. COMEX читает и выдает строку. Если напрямую слать в файловый поток с параметром Dtbyte получаю 0 а строки нет. Если параметром dtAnsiString то нужная строка с лишним 0 (признак конца строки).
Плиз дайте схему как данные с COMEX писать в файл через файловый поток. |
|||
карма: 0 |
|
Разработчик
Ответов: 26305
Рейтинг: 2146
|
|||
alecsvg писал(а): в файл через файловый потокИспользовать конверторы StreamToStr -- из файла в порт и StrToStream -- из порта в файл
alecsvg писал(а): Если параметром dtAnsiStringВ штатном компоненте COMEX нет такого свойства. Нештатные компоненты к расмотрению не принимаются и по ним помощь не оказывается, если этого не соизволит сделать автор компонента |
|||
карма: 22 |
|
Ответов: 22
Рейтинг: 0
|
|||
Я имел в виду компонент файловый поток (DataToFile) и его свойства.
Проверил, уже легче, только зачем мне СOMEX "0D0A" лепит? Я это не заказывал. |
|||
карма: 0 |
|
Ответов: 9906
Рейтинг: 351
|
|||
nesco писал(а): Любая ошибка состояния линии, включая ошибку передачи кадра. Ловится битом EV_ERR в lpEvtMask функции WaitCommEventТы не понял, наверное. Idle Detected не является ошибкой. MSDN я, конечно же -- читал. Коды видел. Просто словов нужных не нашел. Спросил - может ты сталкивался. Вообще-то, Idle Detected - самый нужный сигнал, если ты живешь не в стране "лохотрония". Он означает наличие единицы на линии, длительностью длиннее символа. Это единственное условие, после которого гарантируется правильное фазирование старт-импульса на приемнике и передатчике. Ну и есть протоколы (не придуманные мной, а данные свыше), в которых как раз пауза между символами и является разграничителем пакетов. Вот я не знаю заранее (в этих протоколах) какой длины мне придет пакет - как мне его вытащить и порта... |
|||
карма: 9 |
|
Разработчик
Ответов: 26305
Рейтинг: 2146
|
|||
alecsvg писал(а): Я это не заказывалОн ничего не лепит сам, что передается в линию порта, то там и принимается, сами по себе эти символы не появляются. |
|||
карма: 22 |
|
Ответов: 22
Рейтинг: 0
|
|||
Я сам передаю данные в порт. И в гипертерминале их нет. Тайм аут здесь ни при чем?
|
|||
карма: 0 |
|
Разработчик
Ответов: 26305
Рейтинг: 2146
|
|||
Galkov писал(а): Спросил - может ты сталкивалсяНе, с таким сигналом не сталкивался, тем более, в MSDN. Есть ли вообще в API поддержка этого сигнала напрямую ![]() Galkov писал(а): Вот я не знаю заранее (в этих протоколах) какой длины мне придет пакет - как мне его вытащить и порта...А поддерживает ли UART это сигнал, если поддерживает, то наверняка выдает что-то стандартное типа разрыва линии или ошибки передачи кадра ------------ Дoбавленo в 12.22: alecsvg писал(а): Я сам передаю данные в порт. И в гипертерминале их нетА для передачи Enter нажимаешь, так вот "0D0A" это и есть Enter и таймауты здесь не причем. В буфер чтения не попадает ничего само по себе, только то, что ему передают |
|||
карма: 22 |
|