реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Поменять скорость порта не меняя выхода RTS, среда - Win32
paskal
сообщение Jun 1 2016, 16:38
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 29-10-06
Из: Тула
Пользователь №: 21 769



Пишу бутлодер для процессора. Связь по СОМ-порту, вернее через переходник USB-COM, хотя это вряд ли что меняет.
Итак, связь у меня по UART, а сброс процессора заведен через сигнал RTS.
Сначала я по RTS сбрасываю проц. Он находится в состоянии ожидания синхронизации. Синхронизация идет только на скорости 9600. После успешного получения синхропосылки, он переходит в режим приема команд. Я даю команду поменять скорость на 115200 (на 9600 шьется очень медленно). Затем я меняю скорость на компьютере через API SetCommState. И вот тут - сюрприз! При вызове SetCommState он устанавливает выход RTS, процессор сбрасывается, и переходит в начальное состояние ожидания синхро.
Отсюда вопрос - как менять скорость СОМ-порта не меняя выхода RTS?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 1 2016, 21:34
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (paskal @ Jun 1 2016, 19:38) *
При вызове SetCommState он устанавливает выход RTS, процессор сбрасывается, и переходит в начальное состояние ожидания синхро.

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



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
paskal
сообщение Jun 6 2016, 17:04
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 29-10-06
Из: Тула
Пользователь №: 21 769



Цитата(zltigo @ Jun 2 2016, 00:34) *
Так установливайте в 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 например?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 6 2016, 17:32
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (paskal @ Jun 6 2016, 20:04) *
К сожалению такое решение порождает другую проблему. Дело в том что я пишу в Delphi

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st June 2025 - 20:17
Рейтинг@Mail.ru


Страница сгенерированна за 0.01363 секунд с 7
ELECTRONIX ©2004-2016