| | | | |
Асинхронный режим чтения из Com-порта | Полный текст материала
Другие публикации автора: Александр Терехов
Цитата или краткий комментарий: «... Порядок запуска и работы "службы" (назовем все описываемое ниже так) Com-портов состоит из нескольких достаточно хорошо описанных шагов ... ...» |
Важно:- Страница предназначена для обсуждения материала, его содержания, полезности, соответствия действительности и так далее. Смысл не в разборке, а в приближении к истине :о) и пользе для всех.
- Любые другие сообщения или вопросы, а так же личные эмоции в адрес авторов и полемика, не относящаяся к теме обсуждаемого материала, будут удаляться без предупреждения авторов, дабы не мешать жителям нормально общаться.
- При голосовании учитывайте уровень, на который расчитан материал. "Интересность и полезность" имеет смысл оценивать относительно того, кому именно предназначался материал.
- Размер одного сообщений не должен превышать 5К. Если Вам нужно сказать больше, сделайте это за два раза. Или, что в данной ситуации правильнее, напишите свою статью.
Всегда легче осудить сделанное, нежели сделать самому. Поэтому, пожалуйста, соблюдайте правила Королевства и уважайте друг друга.
Добавить свое мнение.
| | Содержит полезные и(или) интересные сведения | [1] | 3 | 27.3% | | | | Ничего особенно нового и интересного | [2] | 3 | 27.3% | | | | Написано неверно (обязательно укажите почему) | [3] | 5 | 45.5% | | Всего проголосовали: 11 | | | Все понятно, материал читается легко | [1] | 4 | 50% | | | | Есть неясности в изложении | [2] | 4 | 50% | | | | Непонятно написано, трудно читается | [3] | 0 | 0% | | Всего проголосовали: 8 |
[Работа с модемом] [COM-порт]
Отслеживать это обсуждение
Всего сообщений: 1106-02-2013 07:28Автору - огромное спасибо за рабочий пример с исходниками! |
|
25-08-2005 01:23Написано все понятно, работает под любую винду, и с любыми дудоргами, типа USB в Com лично пробовал, только при преобразовании массива полученных данных, вот эти строки:
If ByteReaded>0 Then
Begin
Str:=String(MyBuff);
End;
допущена грубая ошибка, так делать нельзя, данные будут теряться. Нужно писать так:
if ByteReaded>0 Then
begin
SetLength(Str,ByteReaded+1);
Move(MyBuff[0],Str[1],ByteReaded);
end;
А вобще пример расписан хорошо, можно сказать на пальцах. |
|
02-04-2005 00:57К тому как уже отмечалось ранее могу добавить, что автор очень зря вскользь упомянул о таймаутах. В описываемом им подходе их настройка принципиальна. Если внешнее устройство шлет непрерывно данные некими пакетами - нарвешься на то, что ReadFile вообще никогда не "вернется" до переполнения буфера драйвера и то если это настроишь. Да и вообще, генерить поток, который тупо (через драйвер конечно) дергает микросхему, в смысле читает ее регистры - дурной тон при наличии SetCommMask и WaitCommEvent.
|
|
02-06-2004 12:50Автором приведен простенький пример. Провереный на WIN95/WIN98, а не WIN2000, UNIX или каких-либо других ОС (автором в статье задавался вопрос по поводу работы программы в WIN95/WIN98). Защиты от "дурака" программа не имеет, что и не являлось целью статьи. На мой взгляд пример программы может быть использован для отправной точки дальнейшей модернизации.
|
|
22-03-2004 16:21нигде не указано, что в Windows 2000 этот пример не работает. +ошибки работы с потоками.
Сам ищу как заставитьь работать с Com портом Win2k. Если кто-нибудь знает как (либо знает безплатную компоненту) пожалуйста напишите на мыло eaglenn@hotbox.ruСообщение не подписано |
|
27-10-2003 21:07Большое спасибо Вам Александр, я никогда не верил в Windows и все его классы, а также програмирование в нем, и поэтому почти никогда с использованием егг классов программы не писал. Недавно в связи с этим я попал в затруднительное положение, и я очень рад что нашел вашу статью и разобрался с проблемой зависания программы. |
|
09-12-2002 18:25В добавлении к предыдущему сообщению. (К сожалению не поставил подпись).
Первое сообщение было написано без проверки программы, а теперь очень хочется сказать автору: "Не надо больше писать статейки, а надо купить Рихтера и выучить наизусть или хотя бы просто один раз прочесть и понять. Иначе рекомендую не заниматься больше программированием."
Ошибки:
1.Вызов функции ReadFile завершается с ошибкой 87 (Неверный параметр), т.к. не указан указатель на структуру OVERLAPPED.
2. Зависание программы происходит из-за dead-lock, ожидание потока самого себя в destructor-е.
3. Асинхронный режим - это не создание дополнительных потоков,а использование возможности ОС при выполнении операций ввода-вывода.
4. Форматирование исходного текста и большое количество комментариев сильно затрудняет чтение.
5. Нет проверки результата инициализации com-порта, нет настройки порта на скорость. Непонятны значения для таймаутов.
|
|
09-12-2002 17:57Сама статья и пример абсолютно неинтересны, к тому же содержат некоторые неточности (учитывая замечание выше):
1. Непонятен вызов функции SysErrorMessage
2. Использование функций BeginThread и EndThread абсолютно безопасно
( автор спутал использование функции CreateThread )
3. Функция WaitCommEvent воспринимает как последний параметр указатель на структуру OVERLAPPED, что подразумевает асинхронность.
Вывод: перед тем как писать статьи следует ХОРОШО знать описываемый материал или RTFM.Сообщение не подписано |
|
09-12-2002 15:171. Библиотека VCL не является потокобезопасной. В то же время автор статьи обращается к ряду свойств и компонент формы в дополнительном потоке.
2. Из текста статьи неясно, как же работать с функцией WaitCommEvents.
3. В примере используется синхронный ввод/вывод для файла (порта), открытого с флагом FILE_FLAG_OVERLAPPED, тогда как Microsoft не рекомендует так поступать. В этом случае сообщение об окончании чтения/записи может быть некоректным. См. примечания к ReadFile/WriteFile в MSDN.
4. Скомпилированный пример оказался неработоспособным в Windows NT 4.0 и Windows 2000, а ввод имени несуществующего или занятого други процессом порта приводил к зависанию программы. |
|
08-12-2002 09:00А зачем это при наличии компонентов AsyncPro? |
|
06-12-2002 18:00C NT/2000/XP это работает? |
|
|
|