|  | 
 
 | 
| 
 | |||||||
| Регистрация | << Правила форума >> | 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, затем выбирай из этого буфера то что нужно тебе, очищай его и так по кругу. | 
| 
			 
			#7  
			
			
			
			
		 | |||
| 
 | |||
|   Aristarh Dark пробую я щас так делать. Столкнулся с проблемой (это не проблема, для тех кто проффесионально занимается программирование на делфи) но как мне 4 символа из строки вывести эти значения в шестнадцатеричном формате в многострочное текстовое поле? | 
| 
			 
			#8  
			
			
			
			
		 | ||||
| 
 | ||||
|   Вопроса не понял, какойто словесный бред. Покажи на примере что есть и что получить нужно. | 
| 
			 
			#9  
			
			
			
			
		 | |||
| 
 | |||
|   лучше подскажите как в момент передачи данных изменить скорость порта | 
| 
			 
			#10  
			
			
			
			
		 | ||||
| 
 | ||||
|   Юзай SetCommState | 
| 
			 
			#11  
			
			
			
			
		 | |||
| 
 | |||
|   я это понял первый раз я выставляю скорость а потом не могу её поменять а у меня задача когда устройство послало сигнал поднять скорость через 64 символа вернуть скорость обратно и считать данные и снова ждать сигнала от устройства устройства это iButton (читает ТМ ключи через ком порт) | 
| 
			 
			#12  
			
			
			
			
		 | |||
| 
 | |||
|   а у меня не получается поменять скорость (она не меняетсь) | 
| 
			 
			#13  
			
			
			
			
		 | ||||
| 
 | ||||
|   Плохо хочешь   | 
| 
			 
			#14  
			
			
			
			
		 | ||||
| 
 | ||||
|   Вот кусок кода из моей работающей программы: Код: //Понижаем скорость на порту GetCommState(Device.PortHandle,DCB); DCB.BaudRate:=9600; SetCommState(Device.PortHandle,DCB); | 
| 
			 
			#15  
			
			
			
			
		 | |||
| 
 | |||
|   я с тобой согласен 1 описываем порт 2 опрашиваем порт 3 выставляем скорость порта (19200) 4 выставляет время 5 SetCommMast в принципе он готов и тут начинается самое интересное 1 с порта считываем данные (данных нет ) 2 с порта поступили данные (один символ '152') 3 поднимаем скорость (115200) //нет реакций 4 отправляем один символ ('0') 5 порт отвечает ('0','152') 6 передаем данные по символьно ('255','255','0','0' не пакетом а по символьно 64) 7 понижаем скорость(19200) //нет реакций 8 передаем данные ('0') 9 порт скидывает нам пакет данных //если скорость не переключалась пакет не верный за портом слежу через программу 'Device Monitoring Studio' и сравниваю с прогой которая уже работает с портом(скачена с инета) мне надо чтоб порт опрашивалось также но составляла базы даннах(работала иначе) |