Перейти к содержанию
    

Поменять скорость порта не меняя выхода RTS

Пишу бутлодер для процессора. Связь по СОМ-порту, вернее через переходник USB-COM, хотя это вряд ли что меняет.

Итак, связь у меня по UART, а сброс процессора заведен через сигнал RTS.

Сначала я по RTS сбрасываю проц. Он находится в состоянии ожидания синхронизации. Синхронизация идет только на скорости 9600. После успешного получения синхропосылки, он переходит в режим приема команд. Я даю команду поменять скорость на 115200 (на 9600 шьется очень медленно). Затем я меняю скорость на компьютере через API SetCommState. И вот тут - сюрприз! При вызове SetCommState он устанавливает выход RTS, процессор сбрасывается, и переходит в начальное состояние ожидания синхро.

Отсюда вопрос - как менять скорость СОМ-порта не меняя выхода RTS?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При вызове SetCommState он устанавливает выход RTS, процессор сбрасывается, и переходит в начальное состояние ожидания синхро.

Так установливайте в SetCommState RTS_CONTROL_DISABLE. Вот и все.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так установливайте в SetCommState RTS_CONTROL_DISABLE.

К сожалению такое решение порождает другую проблему. Дело в том что я пишу в Delphi, а там в структуре DCB нет поля fRtsControl, сама структура DCB какая то урезанная - вот описание в модуле windows.pas:

type
  _DCB = packed record
    DCBlength: DWORD;
    BaudRate: DWORD;
    Flags: Longint;
    wReserved: Word;
    XonLim: Word;
    XoffLim: Word;
    ByteSize: Byte;
    Parity: Byte;
    StopBits: Byte;
    XonChar: CHAR;
    XoffChar: CHAR;
    ErrorChar: CHAR;
    EofChar: CHAR;
    EvtChar: CHAR;
    wReserved1: Word;
  end;
  {$EXTERNALSYM _DCB}
  TDCB = _DCB;
  DCB = _DCB;
  {$EXTERNALSYM DCB}

А нет ли другого способа менять скорость? Такого чтоб не затрагивал другие настройки. Может через DeviceIOControl например?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

К сожалению такое решение порождает другую проблему. Дело в том что я пишу в Delphi

Ужас. А GetProcAddress и прямо сделать вызов функции kernel32.dll без безумных борлонячих прокладок и оберток не судьба?

Ну или откомпилируйте несколько строк любым вменяемым компилятором и прилинкуйте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...