Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.11.2011, 14:16   #1
IIUH
Пользователь
 
Регистрация: 02.08.2011
Сообщений: 35
По умолчанию получение данных с COM порта Delphi (проблема)

есть пргорамма, которая снимает данные с устройств через СОМ порт. прибор - цифорвой тахометр отечественного производства СОТ-4 работает по протоколу RS-232. (да да уже неоднократно поднимали подобные темы).

в программе учтены все "прелести" работы с устройством данного типа (чётность/нечётность, стоп биты, скорость обмена, отправка нужных символов и т.д.), но данные не принимаются.

мониторили порт специальной программой, заточенной под данный протокол обмена,и выяснили, что сигнал из порта передаётся по 2му пину, а в порт пишется по 3ему пину.

писали аналогичную программу для работы с весами и всё работает отлично, но для весов: передача из порта 6,8 пины.

собственно вопрос: могут ли возникнуть проблемы из-за этой разницы? и если да, то как нам быть? есть ли способ программировать порт по каждому пину в отдельности? работаемна языке Delphi.
IIUH вне форума Ответить с цитированием
Старый 04.11.2011, 18:56   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...такая проблема посмотреть распиновку COM порта, что для чего?


http://pinouts.ru/SerialPorts/Serial9.shtml

Цитата:
есть ли способ программировать порт по каждому пину в отдельности
не по каждому из всех, но да, управление возможно.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 05.11.2011, 14:57   #3
IIUH
Пользователь
 
Регистрация: 02.08.2011
Сообщений: 35
По умолчанию

ну распиновку мы смотрели ещё когда тестили осцилографом наличие сигнала. за линк конечно сппсибо, но тем не менее остался актуальным вопрос

Цитата:
Сообщение от IIUH
могут ли возникнуть проблемы из-за этой разницы? и если да, то как нам быть?
так же интересует более подробная информация по вопросу
Цитата:
Сообщение от raxp
не по каждому из всех, но да, управление возможно.
что-то я не находил информации об этом для Delphi
IIUH вне форума Ответить с цитированием
Старый 05.11.2011, 20:31   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
1 DCD <- Carrier Detect
2 RXD <- Receive Data
3 TXD -> Transmit Data
4 DTR -> Data Terminal Ready
5 GND == System Ground
6 DSR <- Data Set Ready
7 RTS -> Request to Send
8 CTS <- Clear to Send
9 RI <- Ring Indicator

Первый контакт, DCD, передает сигнал начала передачи данных. В принципе, он необязателен, но в условиях с большим количеством помех бывает весьма полезен. RXD — контакт, принимающии данные. Это один из трех необходимых сигналов. TXD — передача данных, так что очевидно, что он тоже незаменим. DTR, DSR, RTS и CTS служат только для проверки и подтверждения отправки-получения данных. Обычно классический нульмодем не превышает длины в полтора метра, а при такой длине шнура трудно навести какие-либо помехи. RI — сигнал начала связи, который сохранился как историческая реликвия и практически никогда не использовался, даже в дремучие времена DOS. И наконец, GND — «земля».

Цитата:
Как следует из таблицы, выводу RTS соответствует 7 контакт стандартного
девятиконтактного COM порта. Он относится к 4 подрегистру и имеет в нём вес равный 2.
Адрес базового регистра, это адрес порта. Для COM1 он равен $3F8 (для COM2 - $2F8,
для LPT1 - $378, LPT2 - $278).
Таким образом, мы можем записать:
Код:
program prim1; 
uses crt,dos; 
var 
base: integer;   
 
begin 
base:=$3F8;  {Присвоение переменной base баз. адреса} 
port[base+4]:=2;   {Установить RTS} 
readln;          {Ждать нажатия Enter} 
port[base+4]:=0;   {Сбросить все выходы порта} 
end.
Цитата:
Эти строчки приведут к установке +12в на выводе 7 порта.
Сразу напрашивается вопрос - как запитать несколько выходов сразу. Ответ - просто сложить коды выходов. Например, мы хотим «зажечь» выходы RTS и DTR. Тогда пишем:
Код:
port[base+4]:=3;
Цитата:
Сбросить все выходы порта можно отправив туда 0, а вот для того, чтобы сбросить
нкретную ножку, оставив остальные без изменения, требуется отправить в порт значение, логически обратное весу сбрасываемого вывода. Например, для RTS это будет выглядеть так:
Код:
port[base+4]:=port[base+4] and (not 2);
Это под DOS. Под Win загляните в исходники того же компонента CPort. Использование структуры DCB.

Добавлено
Код:
// apply port properties
procedure TCustomComPort.ApplyDCB;
const
  CParityBits: array[TParityBits] of Integer =
    (NOPARITY, ODDPARITY, EVENPARITY, MARKPARITY, SPACEPARITY);
  CStopBits: array[TStopBits] of Integer =
    (ONESTOPBIT, ONE5STOPBITS, TWOSTOPBITS);
  CBaudRate: array[TBaudRate] of Integer =
    (0, CBR_110, CBR_300, CBR_600, CBR_1200, CBR_2400, CBR_4800, CBR_9600,
     CBR_14400, CBR_19200, CBR_38400, CBR_56000, CBR_57600, CBR_115200,
     CBR_128000, CBR_256000);
  CDataBits: array[TDataBits] of Integer = (5, 6, 7, 8);
  CControlRTS: array[TRTSFlowControl] of Integer =
    (RTS_CONTROL_DISABLE shl 12,
     RTS_CONTROL_ENABLE shl 12,
     RTS_CONTROL_HANDSHAKE shl 12,
     RTS_CONTROL_TOGGLE shl 12);
  CControlDTR: array[TDTRFlowControl] of Integer =
    (DTR_CONTROL_DISABLE shl 4,
     DTR_CONTROL_ENABLE shl 4,
     DTR_CONTROL_HANDSHAKE shl 4);
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 05.11.2011 в 22:08.
raxp вне форума Ответить с цитированием
Старый 05.11.2011, 22:08   #5
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

продолжение (не влезло):
Код:
var
  DCB: TDCB;

begin
  // if not connected or inside BeginUpdate/EndUpdate block, do nothing
  if FConnected and (FUpdateCount = 0) and
    not ((csDesigning in ComponentState) or (csLoading in ComponentState)) then
  begin
    DCB.DCBlength := SizeOf(TDCB);
    DCB.XonLim := FBuffer.InputSize div 4;
    DCB.XoffLim := DCB.XonLim;
    DCB.EvtChar := TCPortChar(FEventChar);

    DCB.Flags := dcb_Binary;
    if FDiscardNull then
      DCB.Flags := DCB.Flags or dcb_Null;

    with FFlowControl do
    begin
      DCB.XonChar := XonChar;
      DCB.XoffChar := XoffChar;
      if OutCTSFlow then
        DCB.Flags := DCB.Flags or dcb_OutxCTSFlow;
      if OutDSRFlow then
        DCB.Flags := DCB.Flags or dcb_OutxDSRFlow;
      DCB.Flags := DCB.Flags or CControlDTR[ControlDTR]
        or CControlRTS[ControlRTS];
      if XonXoffOut then
        DCB.Flags := DCB.Flags or dcb_OutX;
      if XonXoffIn then
        DCB.Flags := DCB.Flags or dcb_InX;
      if DSRSensitivity then
        DCB.Flags := DCB.Flags or dcb_DSRSensivity;
      if TxContinueOnXoff then
        DCB.Flags := DCB.Flags or dcb_TxContinueOnXoff;
    end;

    DCB.Parity := CParityBits[FParity.Bits];
    DCB.StopBits := CStopBits[FStopBits];
    if FBaudRate <> brCustom then
      DCB.BaudRate := CBaudRate[FBaudRate]
    else
      DCB.BaudRate := FCustomBaudRate;
    DCB.ByteSize := CDataBits[FDataBits];

    if FParity.Check then
    begin
      DCB.Flags := DCB.Flags or dcb_Parity;
      if FParity.Replace then
      begin
        DCB.Flags := DCB.Flags or dcb_ErrorChar;
        DCB.ErrorChar := TCPortChar(FParity.ReplaceChar);
      end;
    end;

    // apply settings
    if not SetCommState(FHandle, DCB) then
      raise EComPort.Create(CError_SetStateFailed, GetLastError,FPort);
  end;
end;
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 07.11.2011, 18:36   #6
IIUH
Пользователь
 
Регистрация: 02.08.2011
Сообщений: 35
По умолчанию

может я чего-то не понимаю, но, на сколько я вижу, в вашем коде идёт настройка DCB структуры для работы с портом.... у нас эти настройки известны заранее и прописаны. (заранее извиняюсь если вдруг я что-то непонял).

перед нами стоит конкретная задача6 реализовать запись в порт и тут же чтение с него. всё прописано в асинхронном режиме и должно работать адекватно, но этого не происходит.

по вашему коду: что-то не могу найти конкретного указания пинов по которым мы должны работать (они вообще есть там?).... если не сложно, укажите пожалуйста эти строки. Заранее благодарен.
IIUH вне форума Ответить с цитированием
Старый 08.11.2011, 12:22   #7
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...эге, да вам прямиком стандарт RS-232 читать и про структуру DCB в частности, указано в ссылке выше. Тогда и должно прийти понимание сигналов RTS, DTR и т.д. и соответствие их пинам. Удачи!
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
расшифровка данных, принятых с COM-порта IIUH Общие вопросы Delphi 25 12.04.2021 14:05
Получение данных из 3dsMax в Delphi rammic Общие вопросы Delphi 0 06.09.2011 12:33
Чтение данных с COM порта 232 Dimitr_88 Общие вопросы C/C++ 10 03.09.2010 10:39
Delphi получение данных из массива? kino Помощь студентам 2 16.12.2009 22:06
Приём данных с com порта kyc0k Помощь студентам 3 28.03.2008 15:04