Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.128.201.71] |
|
Сообщ.
#1
,
|
|
|
Работая с COM портом через функцию WINAPI EscapeCommFunction мы можем управлять такими выводами как RTS и DTR. Можно установить их в состояние 1 или сбросить в 0.
Но мне нужно так же уметь делать в выводом TX до отправки каких-либо данных. Это нужно при общении с микроконтроллером в режиме 1-WIRE (где TX и RX объединены), для входа в BOOT LOADER. Например, на PureBasic это решается встроенной в него функцией SetSerialPortStatus(#com_port, #PB_SerialPort_TXD, 0) или SetSerialPortStatus(#com_port, #PB_SerialPort_TXD, 1). Но в WINAPI не нашёл такого. Прошу поделиться знаниями и предложениями по этому вопросу. |
Сообщ.
#2
,
|
|
|
https://learn.microsoft.com/ru-ru/windows/w...se-setcommbreak
Состояние BREAK для линии TX и есть выдача активного уровня (нуля). Но если речь идет об 1-Wire имени Далласа, который используется в "таблетках" DS1921, термометрах DS18B20 и подобных микросхемах, то в нем нет необходимости "дергать" TX вручную - там достаточно установить соответствующую скорость и передавать либо 0xF0, либо 0x00 на каждый бит в зависимости от его значения (1 или 0). Стартовое условие тоже передается как 0xF0, но на более низкой скорости. |
Сообщ.
#3
,
|
|
|
Dushevny, спасибо, буду смотреть в направлении SETBREAK
Дёрнуть напрямую TX нужно только один раз при входе в загрузочный режим микроконтроллера. Там суть в том, что бы перейти с низкого на высокий на выводе RESET контроллера (используются RTS или DTR COM порта) при низком MODE (используется TX+RX), и только затем установить MODE в высокий. Вот тут-то и нужно дёрнуть TX напрямую А далее уже идёт стандартный (UART) обмен данными по линии контроллера MODE (RX+TX). После согласования скорости, конечно. |
Сообщ.
#4
,
|
|
|
Да, это сработало как нужно:
resF = EscapeCommFunction(hPort, SETBREAK); или resF = SetCommBreak(hPort); А после необходимой операции на линии вернуть состояние TX обратной функцией. Только нужно выставить параметр fAbortOnError = FALSE в структуре DCB, иначе, если там будет true (а у меня так было по умолчанию), то после установки SETBREAK любые манипуляции с СОМ портом будут заблокированы до сброса ошибок функцией ClearCommError. Dushevny, большое спасибо. |