|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
rs 232, ассинхроный режим, делфи
как открыть порт?как принимать и отсылать на порт?
|
#2
|
||||
|
||||
CreateFile с \\.\COM0 - открыть порт 0
WriteFile - писать в порт ReadFile - читать из порта Пишу программы за еду. __________________ |
#3
|
|||
|
|||
ммм... класс,а если чуть-чуть поподробнее,или примерчик, позааааааайлюста, я тебе печеньку за это дам))
|
#4
|
|||
|
|||
Я бы порекомендовал не изобретать велосипед, а использовать готовый бесплатный компонент bcomport или mscomm. Сам не раз работал с ними и остался доволен. Тем более, что bcomport позволяет как на низком так и на высоком уровне работать с COM-портом в асинхронном режиме.
К bcomport также прилагается документация с примерами на русском языке. Скачать bcomport можно отсюда. |
#5
|
|||
|
|||
Доброго всем времени суток!
Задача которая стоит передомной: есть девайс который раз в 5 секунд посылает на ком порт пакет такого формата 84 хх хх хх хх 85(в шеснадцатерисном значении), где хх 4 байта значение можности. Эти пакеты нужно принимать, заначение можности выводить в много строчное текстовое поле, создавать экселевский файл и записывать в каждую я чейку значения можности. Ну вывод в многострочное текстовое поле вообще проюблем нет, создание экселевского файла и запись в него думаю осилю, а вот с ком портом проблемы. Как говорил programm007 использовал компонет bcomport в асинхронном режиме, использовал собитые OnRxChar компонета и чтение в строковую переменную и в многострочное текстовое поле выводил количество запрашиваемых для чтения байт, и количество байт которые удалось прочитать. Пример с хелпа на компонет: Код:
procedure TForm1.BComPort1RxChar(Sender: TObject; Count: Integer); var Str: String; Stat: PAsync; N: Integer; begin InitAsync(Stat); try BComPort1.ReadStrAsync(Str, Count, Stat); repeat // Выполнение других действий until BComPort1.IsAsyncCompleted(Stat); N := BComPort1.WaitForAsync(Stat); if N <> Count then SetLength(Str, Count); finally DoneAsync(Stat); end; // Действия с переменной Str end; Наблюдаю такую картину иногда процедура читает полностью весь пакет, т.е выводится что процедура прочла все 6 байт, а иногда показывается что при приёме пакета процедура была выполнена 2 раза, т.е читаем сначала например 2 байта, а потом 4 байта. Причем таких случаев половина, не терять же мне половину данных? Нет. Ещё пакет может разбиваться на такие варианты приходит 1 и 5 байт, 2 и 4 байта, 3 и 3, 4 и 2, ну соответственно 5 и 1. и всегда сумма получается 6 байт. Мои мысли по этому поводу: процедура успевает выполниться быстрее чем придут данные в буфер порта. А так как я в конце процедуры очищаю приёмный буфер, то оно опять видит что данные в буфере есть и опять выполняется эта процедура. Прощу помощи как написать эту часть программы чтобы за 1 раз стабильно читался весь пакет 6 байт. Пакеты от устройства приходят стабильно, пакеты корректные, проверял в терминалке. За рание всем спасибо за внимание. Последний раз редактировалось Admin, 19.06.2011 в 14:57. |
#6
|
||||
|
||||
Ну просто же
Накапливай буффер до тех пор пока не придет 85, затем выбирай из этого буфера то что нужно тебе, очищай его и так по кругу. Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |