smart ups

lhassa
Offline
Зарегистрирован: 31.01.2013

Добрый день!

Нужно управлять smart ups  и снимать с него данные c помощью arduino. Имею smart ups 450 c com портом и такой переходник для arduino. Подключаю к RX и TX serial пинам 0 и 1 и не вижу вывода ups, к этим пинам пробовал подключать модуль sim 900 все отлично работает, могу ввести команды и получить ответ. Может быть я не понял и этот переходник не подходит?

 

 

 

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

rx tx поменяйте местами. питание подали?

если все правильно как минимум кашу из букв получите. дальше нужно узнать или подобрать скорость. и возможно поднастроить режим приема данных

lhassa
Offline
Зарегистрирован: 31.01.2013

2400 скорость, и питание есть и местами менял, один раз получил постоянный перевод строки 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

упс данные всегда шлет или по событию?

Garry
Garry аватар
Offline
Зарегистрирован: 07.04.2012

Тестировал я подобную штуку (RS232-TTL конвертер), например такую. Подключил к разъему DB9 этой штуки конвертер RS232-USB (например MasterKit BM8050), USB воткнул в комп (может драйвера потребуются, не помню уже), получается такая связка:

Arduino --- ваш RS232-TTL конвертер --- RS232-USB конвертер --- ПК

Простенький скетч на прием данных из Serial и оправки их обратно. На ПК запускаете любую терминальную программу на COM порт установленного RS232-USB конвертера. Проверяете работоспособность вашей штуковины, находите скорость передачи и т.д.

 

 

lhassa
Offline
Зарегистрирован: 31.01.2013

по событию и по команде, как пишут в этой статье http://www.networkupstools.org/ups-protocols/apcsmart.html 

выключал его из сети, пищит но в порт ничего не шлет (

 

Garry
Garry аватар
Offline
Зарегистрирован: 07.04.2012

lhassa пишет:

по событию и по команде, как пишут в этой статье http://www.networkupstools.org/ups-protocols/apcsmart.html 

выключал его из сети, пищит но в порт ничего не шлет (

А обратили внимание на то, что есть отличие от стандартной распиновки разъема DB9 ? Посмотрите в самом начале описания по вашей ссылке абзац RS232 Differences. Там сказано, что TxD идет не на контакт 3 (как обычно), а на контакт 1 разъема DB9!

 

 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011
lhassa
Offline
Зарегистрирован: 31.01.2013

Да, конечно! Использую входящий в комплект кабель 940-0024C. Ну только пришлось еще дозаказать такой вот переходник 

 

 

Serial RS232 DB9 9-Pin Male to Male, проверял и его методом прозвона, 

Кабель и порт UPS проверял через компьютер на стандартном ПО которое шло к бесперебойнику.

Garry
Garry аватар
Offline
Зарегистрирован: 07.04.2012

lhassa пишет:

Да, конечно! Использую входящий в комплект кабель 940-0024C.

Давайте разбираться ... Тут должно быть все очень просто.

Прозвоните кабель 940-0024C, получите такую картинку (интересует соответсвие номеров контактов трех верхних линий: Rx, Tx, GND  собоих сторон)?

Garry
Garry аватар
Offline
Зарегистрирован: 07.04.2012

lhassa пишет:

Serial RS232 DB9 9-Pin Male to Male, проверял и его методом прозвона, 

Какую распиновку видите при прозвоне?

Похоже, что должна быть такая картина: 3 --- 3, 2 --- 2, 5 --- 5, это так?

 

lhassa пишет:

Кабель и порт UPS проверял через компьютер на стандартном ПО которое шло к бесперебойнику.

Это хорошо.

 

lhassa
Offline
Зарегистрирован: 31.01.2013

Garry пишет:

lhassa пишет:

Serial RS232 DB9 9-Pin Male to Male, проверял и его методом прозвона, 

Какую распиновку видите при прозвоне?

Похоже, что должна быть такая картина: 3 --- 3, 2 --- 2, 5 --- 5, это так?

 

 

 

 

 

да, именно так!

 

 

Garry
Garry аватар
Offline
Зарегистрирован: 07.04.2012

А прозвонку 940-0024C делали, что там? 

lhassa
Offline
Зарегистрирован: 31.01.2013

пока нет, вечером сделаю, но раз с компом по этому кабелю работало, думаю все в порядке, но сделаю, т.к. сам понимаю что все просто но не работает (

может быть в коде дело? у меня мега.

 

while(Serial2.available()) 
    { 
    char serial_in_char = Serial2.read();
    Serial.print(serial_in_char); 
    }
 
 
Garry
Garry аватар
Offline
Зарегистрирован: 07.04.2012

Код норм, но тут не в коде дело. Прояснить надо пару-тройку моментов:

1) Проверить зверька, который в первом посте с помощью 2-х терминалов на компе, но для этого нужен конвертер RS232-USB для подкючения зверька к компу, ну или комп с COM-портом. Тогда вы будете знать, что с ним все в порядке. Дайте ссылку на WiKi зверька или его схему, хочу понять как у него согласуются пины на DB9 и на TTL к Arduino.

2) Далее. Убедиться что оба сигнала (Tx, RX) проходят и правильно проходят от UPS до Arduino через кучу "перемычек". Тут и выяснится как правильно подать TTL Tx/Rx(зверька) на Tx/RX(Arduino), менять или не менять их местами.

3) А вот после этого надо курить матчасть по самому протоколу UPS. Меня, например, насторожила такая фраза из описания по вашей ссылке, может на этом этапе и косяки!?:

The Smart Protocol

Despite the lack of official information from APC, this table has been constructed. It's standard RS-232 serial communications at 2400 bps/8N1. Don't rush the UPS while transmitting or it may stop talking to you. This isn't a problem with the normal single character queries, but it really does matter for multi-char things like "@000". Sprinkle a few calls to usleep() in your code and everything will work a lot better.

 

Garry
Garry аватар
Offline
Зарегистрирован: 07.04.2012

Вот ссылка на подобную разработку. Может по программе что-то полезное найдете.

lhassa
Offline
Зарегистрирован: 31.01.2013

1) ну вот все что по нему есть, только у меня микросхема огромная и не впаяна а сидит в гнезде 

http://dx.com/p/rs232-serial-port-to-ttl-converter-module-w-transmitting...

 

2) да я уже думал об этом, и так и так пробовал, менял и в кабеле и подключение к arduino

 

3) я так понимаю нужно передавать по символу? но вроде и так скорость порта низкая и UPS должен принимать данные.

Garry
Garry аватар
Offline
Зарегистрирован: 07.04.2012

Ну раз так написано и на это специально обращают внимание, то пробуйте по-символьно передавать с задержкой usleep() - я так понял в микросекундах.

 

lhassa
Offline
Зарегистрирован: 31.01.2013

ну он бы хоть один символ отправил сам

lhassa
Offline
Зарегистрирован: 31.01.2013

Garry пишет:

А прозвонку 940-0024C делали, что там? 

 

сделал прозвонку, кабель в порядке, все по схеме.

lhassa
Offline
Зарегистрирован: 31.01.2013

Garry пишет:

Вот ссылка на подобную разработку. Может по программе что-то полезное найдете.

 

ну мне бы пока хоть какие данные получить с него, у меня тоже что-то похожее но arduino просто будет отсылать ответ от ups на сервер по udp. Вся эта двухсторонняя связь уже реализована на примере модуля sim 900 и отлично работает.

Garry
Garry аватар
Offline
Зарегистрирован: 07.04.2012

Собрал тестовый стенд: APC UPS --- кабель 940-0024С --- конвертер RS232-USB --- PC. Запустил на ПК терминал 2400/8/1, ответа на команды нет :( Пошел курить мануал по протоколу по вашей ссылке... а там написано следующее:

Выход из этого режима - символ 'R'.

Протестировал несколько команд - все работает. Но вот команды из двух символов не смог проверить, например самая первая - '^A', видимо это программным способом можно проверить с задержкой между символами usleep(), как описано в мануале.

Дерзайте!

 

Garry
Garry аватар
Offline
Зарегистрирован: 07.04.2012

И еще на заметку... я давал ссылку на подобную разработку, там даже код программы приведен, вы бы хоть глянули, может и сами разобрались с проблемой!

Только я бы написал иначе: Serial.print('Y'), т.к. UPS от нас ждет символа, а не строку.

Теперь разберитесь со своим зверьком (Tx/Rx к Arduino) и все у вас должно получиться!

 

lhassa
Offline
Зарегистрирован: 31.01.2013

Да, конечно я видел вход в режим smart, еще раз все проверил посылаю Y никакой реакции ((( в консоле пустота ((

А вы не пробовали без команд он что либо отправляет если выключить блок из сети 220? И какой символ на конце? 

Garry
Garry аватар
Offline
Зарегистрирован: 07.04.2012

Странно. Опишите популярно ваш тестовый стенд. Всю связку железа, какой софт и где крутиться. Можете картунку нарисовать для наглядности, может и весь код для тестирования связи с UPS.

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

 

 

lhassa
Offline
Зарегистрирован: 31.01.2013

Ну кабель от смарта идет в переходник о котором я говорил выше, к нему идет питание 5v от блока питания и от этого блока питания идет питание на arduino mega, это не совсем тестовый стенд а рабочая система управления домом которая представляет из себя сеть из контроллеров uno, nano и mega, ну это не так важно т/к/ в ней успешно работает модуль sim900 на serial3, в serial2 на пины 16 и 17

вот верхний кусок кода на скрине подает команды на модуль sim900, берет он эти команды от udp запроса программы на delphi, она на скрине, а ответ получаем от контроллера тоже в виде udp запроса и смотрим его на консоле виртуальной машины где и запущен скрипт на php который принимает и отвечает контроллерам uno,nano и mega

на скрине отправка AT команды на модуль sim900 и прием ответа от него

http://i58.fastpic.ru/big/2014/0220/9e/6b8ac9e58f6759d97348fe21b7811a9e.png

Garry
Garry аватар
Offline
Зарегистрирован: 07.04.2012

Я про тестирование вашей проблемы спрашиваю, а вы мне рабочий проект, да еще и про код SIM, который к теме не относится.

Протестировал UPS своим стендом (выше):

Не передавая в упс символа 'Y' при отключении сети 220В, упс ничего не возвращает. Перехожу в режим Smart - символ 'Y', отключаю сеть 220В, упс пищит и раз в 30 секунд передает символ '!'. Штук 6 точно передал, потом перестал, дальше не разбирался.

Вы все это можете сами протестировать: и своего зверька подключенного к Arduino и PC, и UPS подлюченный к PC из терминала.

lhassa
Offline
Зарегистрирован: 31.01.2013

Спасибо! буду пробовать! Теперь хоть ясно что ничего ждать от него не войдя в режим не стоит(

Осталось найти необходимые переходники и тестировать, подозреваю что зверек бракованный( 

 

Garry
Garry аватар
Offline
Зарегистрирован: 07.04.2012

Так если вы свой конвертер не проверяли правильным способом, как можно утверждать что он бракованный?

Я так понял, что в вашем конвертере микруха не запаяна, а сидит в гнезде, есть вариант поменять ее, после неудачной проверки.

Несколько советов по методике тестирования и настройке сериал устройств:

1) Вообще, я всегда при построении сложных комплексов из нескольких устройств проверяю/тестирую прием/передачу каждого устройства отдельно от остальных, это исключает наложение ошибок/проблем от других устройств в комплексе.

2) С учетом пункта (1): физически подключаю устройство к ПК напрямую по USB (без софтверных перемычек на MCU) (для этого обзавелся полезными конвертерами: RS232-TTL, USB-TTL, RS232-USB). Из терминальной программы на ПК проверяю правильность подключения интерфейсов передачи данных (Rx/Tx) устройства, скорость обмена информацией, анализирую возвращаемые данные в ответ на переданные в устройство и т.д. Поверьте, это сэкономит кучу времени при тестировани и в дальнейшем при написании рабочего кода под MCU и позволит избежать многих ошибок и недопониманий!

3) После обследования в пункте (2): теперь, зная все о новом устройстве, можно подключить его к MCU и разносторонне протестировать простыми программами (скетчами, я их отдельно по каждому устройству сохраняю, еще и несколько вариантов разных проверок - на будущее), тут опять ПК может прийти на подмогу для мониторинга интерфейсов приема/передачи из терминальных программ.

4) И только теперь новое утройство можно подключить в комплекс/проект, добавить в код проекта новый код.

 

Для вашего примера с подключением UPS (новое устройство) через ваш RS232-TTL конвертер (новое устройство) к Меге я бы тестирование провел так:

1) Проверяем RS232-TTL конвертер через такую связку (самый первый тест):

RS232-TTL (проверяемый) --- RS232-USB (если нет COM на ПК) --- ПК.

Подключаем стабилизированное питание к выводам V и GND на RS232-TTL (5В/3.3В - не знаю какая микруха в нем и как обвязана). Надежно замыкаем контакты Rx-Tx на RS232-TTLНа ПК с помощью одного терминала на виртуальном COM от RS232-USB (или физическом) посылаем данные и ловим эхо. Все! Если нет эхо-данных и при условии что не напутали с подключением, то вероятно ваш конвертер неисправен. Но можно заменить микруху на нем и снова проверить!

2) Проверяем RS232-TTL конвертер через такую связку:

Мега(UART2) --- RS232-TTL (проверяемый) --- RS232-USB (если нет COM на ПК) --- ПК.

На Меге: С Меги подключаем стабилизированное питание к выводам V и GND на RS232-TTL (5В/3.3В - не знаю какая микруха в нем и как обвязана). Подключаем TX/Rx RS232-TTL к Rx2/Tx2 на Меге (может потребуется поменять их местами!). Пишем "софтверную перемычку" - читаем Serial и посылаем в Serial2, читаем Serial2 и посылаем в SerialНа ПК с помощью двух терминалов (виртуальный COM от USB Меги и COM от RS232-USB (или физическом)) посылаем/принимаем данные (обмен данных между двумя терминалами). 

Попробуйте эти варианты, отпишите.

Проверка связи с UPS аналогична:

UPS (проверяемый) + кабель 940-0024C --- RS232-USB (если нет COM на ПК) --- ПК. На ПК через терминал изучаем протокол APC UPS.

 

 

Garry
Garry аватар
Offline
Зарегистрирован: 07.04.2012

Нашел давний тест (вроде с arduino.cc взял) для изучения класса Serial и проверки зверька Iteaduino Mega 2560 (на комменты не обращайте внимание, я тогда только познакомился с арду-платформой, как ребенок млел от радости за каждую работающую строчку кода :):

// Тестируем Iteaduino Mega 2560 на совместимость с классом SerialX
// !!! ACHTUNG !!! Замкнул перемычкой пины RX2 и TX2. Работает!!!
// !!! ACHTUNG !!! Есть небольшая задержка, первые несколько байт данных не передаются!
//                 После включения SerialMonitor следует подождать несколько секунд.
// !!! ACHTUNG !!! Работает даже без delay(50);

void setup() {
  
  Serial.begin(9600);
  Serial2.begin(9600);
  
  delay(1000);
  
}


void loop() {
  
  static char inByte;
  
  // read from port 0, send to port 2:
  if (Serial.available()) {
    
    inByte = (char)Serial.read();
    Serial2.print(inByte);
    
  }
  
  //delay(50);
  
  // read from port 2, send to port 0:
  if (Serial2.available()) {
    
    inByte = (char)Serial2.read();
    Serial.print(inByte);
    
  }
  
  //delay(50);
  
}

Эту "софтверную перемычку" как раз и использовал потом для проверки дата-кабеля RS232-TTL от старой мобилы SIEMENS.

 

lhassa
Offline
Зарегистрирован: 31.01.2013

Сделал первый тест, но немного по другому. К сожалению сейчас нет под рукой контроллера  RS232-USB и com порта в компе тоже нет (( поэтому залил в мегу перемычку опробовал вначале на модуле sim900 на serial1 в результате получаю эхо (немного не понятно почему только эхо а не ответ от контроллера), затем тестурую smart ups, посылаю Y в результате пустота (( Замыкаю RX и TX в кабеле к UPS передаю любой набор символов получаю эхо. Вывод. Неисправен порт UPS?

Garry
Garry аватар
Offline
Зарегистрирован: 07.04.2012

Конвертер или преобразователь RS232-USB, а не контроллер.

Про СИМ ничего не понял, не пользовал. А что СИМ должен в ответ передавать? Мой код правильно поменяли, проверьте еще раз.

Про УПС тут все понятно: ваш RS232-TTL модуль исправен (собственно микруха)! Т.к. вы замкнули Rx Tx на стороне RS232, то у вас данные из Меги (Tx) прошли через ваш конвертер, через ваше замыкание вернулись обратно в конвертер и пришли обратно в Мегу (Rx). Это не говорит о неисправности УПС, кстати, вы же проверяли связку УПС-ПК родным софтом и все работало!, вы это писали выше. И еще, ваше замыкание только подтверждает исправность конвертера, но ничего не говорит о правильности подключения Rx/Tx конвертера к SerialX Меги по отношению к пинам Rx/Tx на DB9. Поменяйте местми Rx/Tx конвертера при подключении к SerialX Меги и снова протестите 'Y' на УПС, замыкание на кабеле уберите! может и СИМ протестили с каким-нибудь замыканием :)

lhassa
Offline
Зарегистрирован: 31.01.2013

с сим разобрался, просто он ждал перевод строки

родным софтом UPS проверял пару лет назад ) сейчас нет компа с ком портом

да я понял что эхо не гарантирует правильность подключения RX и TX по отношению к DB9, менял местами, ответа нет(

похоже нужно опять проверять родным софтом и терминалом на ПК, пойду починять старый железный комп с ком портом))))

 

lhassa
Offline
Зарегистрирован: 31.01.2013

собрал комп с com портом, протестировал в терминале, все отлично работает как по мануалу.

Тогда я вообще ничего не понимаю, переходник TTL работает, кабель живой, UPS работает, все по отдельности работает вместе нет (

lhassa
Offline
Зарегистрирован: 31.01.2013

разобрался! нужно поменять местами RX и TX на RS232-TTL по отношению к DB9.

я это делал в самом начале с помощью трех перемычек но тогда не знал что нужно передавать Y чтобы получить ответы

в итоге нужно чтобы было так 2-3, 3-2, 5-5 в кабеле UPS - TTL конвертер (не зря у него разъем мама и мне пришлось заказать переходник папа-папа)

Garry
Garry аватар
Offline
Зарегистрирован: 07.04.2012

Тогда вам нужно купить NULL MODEM MINI ADAPTER (папа-папа) вместо вашего GENDER CHANGER и перемычек. NULL MODEM кроссирует линии Rx/Tx - 2-3, 3-2, 5-5. Все.

Garry
Garry аватар
Offline
Зарегистрирован: 07.04.2012

Для тестирования USART устройств нашел такой универсальный конвертер на DFRobot.

9ser
Offline
Зарегистрирован: 18.11.2012

Тоже не получается считать данные контроллером.

Через COM-порт устройство откликается отлично.

Там для отправки или приема данных подозреваю нужн определенный формат?

Пока разбираюсь...

9ser
Offline
Зарегистрирован: 18.11.2012

Вот как выглядит обмен.

Я использую Serial1 для чтения данных с UPS.

Сейчас хочу выводить данные в Serial.

axill
Offline
Зарегистрирован: 05.09.2011

последовал по стопам и сделал такой же обмен при этом у меня опрашиваются два UPS, использую переключалку для UART

самое подробное описание протокола здесь http://www.apcupsd.org/manual/#apc-smart-protocol

Humen
Offline
Зарегистрирован: 16.05.2016

такой вопрос, вы реализовали свой проект?

axill
Offline
Зарегистрирован: 05.09.2011

К кому вопрос?

Forvad
Offline
Зарегистрирован: 09.02.2016

а если Вам? :) можно задать? Вы же говорили чуть выше что "последовал по стопам и сделал такой же обмен" 

Может у Вас остался с тех времён скетч? 

sadman41
Offline
Зарегистрирован: 19.10.2016

Вот это пинг - два года...

Forvad
Offline
Зарегистрирован: 09.02.2016

sadman41 пишет:

Вот это пинг - два года...

всмысле? меня этот вопрос заинтересовал всего дня три назад. Вчера я нашел эту ветку и спросил глянуть наработки, вдруг сделано более правильно, чем я тут наизобретал

sadman41
Offline
Зарегистрирован: 19.10.2016

Так показывайте, мы подскажем. Может быть. APC рулить -дело нехитрое, но не без нюансов. ...Ну или можете ждать, конечно, людей из 2016-го.

Forvad
Offline
Зарегистрирован: 09.02.2016

sadman41 пишет:

Так показывайте, мы подскажем. Может быть. APC рулить -дело нехитрое, но не без нюансов. ...Ну или можете ждать, конечно, людей из 2016-го.

как скажите ;)  вечером, из дома, опишу свою задачу, что я сделал и какие у меня остались вопросы

Forvad
Offline
Зарегистрирован: 09.02.2016

sadman41 пишет:

Так показывайте, мы подскажем. Может быть. APC рулить -дело нехитрое, но не без нюансов. ...Ну или можете ждать, конечно, людей из 2016-го.

расказывать особо и нечего .. есть аппаратура стоящая в отдалённом безлюдном месте, и приехав туда можно обнаружить сдохший аккум на ИБП и ломится обратно за аккумом. Сама аппаратура имеет несколько входов для контроля дверей, дыма, датчика снижения температуры и тому подобного .. и их состояние можно видить удаленно. Все это работает на простом замыкании контактов релюхой. т.е задача подвязать еще идин вход на контроль аккума ИБП. Мое предложение "прилепить" на лампочку УПС-ки :) копеешный модуль с фотодатчиком и реле не вызвал восторга :) сказали такая залепуха не проканает :) Отстаётся брать с ИБП по RS232

В протоколе обмена нашел команду запроса статуса "Q". и таблицу ответов ... и сколько я ны пытался моделировать разные ситуации в ответ прилетает один и тот же код (не помню какой) ... 

Ну и макс что даёт хоть какой то результат .. это посылка "Y" (smart mode) И при горящей лампочке "замените батарею" в ответе всегда присутстует "?" Ну его и ловим его посылая скажем раз в час "Y" 

void loop() 
{

if (millis() - prevMillis > 3600000) // выполнять через час
 {
  Serial.print("Y");
  prevMillis = millis();
 }

 if (Serial.available() > 0)
   {
     int DataUPS = Serial.read();
     if (DataUPS == 63)   // 
       {
         digitalWrite(relay, HIGH); 
       }
     LD.printNumber((long)DataUPS); // переменная, знаков после запятой, столбец, строка
     LD.printString_6x8(" ");
   }
}
 
 
БИТ HEX Шестнадцатиричные данные биты в единичном состоянии которых обозначают:
0 0x01
Состояние рабочей калибровки. Не сообщают Smart UPSv/s, Back UPS Pro.
1 0x02
Режим Smart Trim. Не сообщается 1 и 2 поколением Smart.
2 0x04
Режим Smart Boost.
3 0x08
Работа в сети On Line
4 0x10
Работа от батарей On Battery.
5 0x20
UPS перегружен.
6 0x40
Батарея разряжена. (battery low)
7 0x80
Замените батарею.(replace battery)

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Ответы от упса зависят. У меня старый Smart-UPS 650I не выдает и десятой доли того, что Smart-UPS 2200 RM вываливает.

Обмен у вас не очень правильно написан. Нужно послать 'Y', получить 'SM', после этого команду уже слать и ответ ждать. Завершить сеанс через 'R' (команда без ответа).

В вашем же коде 'Y' отсылается, подтверждение перехода в SMART режим не контролируется, сразу чтение идет чего-то там и интерпретация.

Ждать строку можете через https://www.arduino.cc/en/Serial/ReadString, если по-простому. Между посылками в UPS надо паузы делать, APC не любит торопыг. Я 10 мс паузы ставлю после символа. 

Forvad
Offline
Зарегистрирован: 09.02.2016
Ответы от упса зависят. У меня старый Smart-UPS 650I не выдает и десятой доли того, что Smart-UPS 2200 RM вываливает.
 
APC SUA750I
 
Нужно послать 'Y', получить 'SM',
а что мне это даст? чисто знание что смарт-режим включился? а чего мне от этого знания прибудет? 
 
 после этого команду уже слать и ответ ждать.
дык слать то нечего ...  не нашел я ни какой команды которой можно получить состаяние батареи. Поэтому и не шлю ничего.
 
 
Ждать строку можете через https://www.arduino.cc/en/Serial/ReadString, 
а зачем мне вначале получать строку, а после городить алгоритм поиска в этой строке нужного мне символа "?", если я эти символы поштучно, по мере прихода, буду обрабатывать ... я специально так делать не стал :)
 
Между посылками в UPS надо паузы делать, APC не любит торопыг.
ээээ ... запросы в УПСку мы порешали слать 1 раз в час .. куда уж больше? 
 
Я 10 мс паузы ставлю после символа. 
или Вы про паузу между запросом и ожидание ответа? .. так оно же само ждет пока что-то не придет, зачем приостановливать само это ожидание? а если в это время проскочит ответ? чет я не въезжаю :(
 
я наверно как то плохо описал алгоритм ... после посылки Y в ответ вместе с SM приходят ещё символы, сразу, без всяких дополнительных команд. Один SM приходит если всё ОК, батарея исправна, упс онлайн. Если же нет напряжения то приходит "SM!" если нет батареи "SM?". Если подергать напругу и батарею несколько раз а затем  послеть Y то за SM идут несколько символов, и пропадания "!" и востановление напряжения "$" и тот же "?"
 
Так же я хочу проверить "#" - Замените батарею. Посылается, когда ИБП определяет необходимость замены батареи. Повторяется каждые 5 часов. Тут вообще ничего делать на нужно :) Тупо сиди и слушай порт, как прилетить "#" - реле под ток :) надо попробовать на ночь поставить :)
 
sadman41
Offline
Зарегистрирован: 19.10.2016

Ну, раз вы все решили и сделали, чего я вам советую тут. У меня всё читается нормально