МК меня не понимать. Serial команды не опознаются.
- Войдите на сайт для отправки комментариев
Снова здравствуйте всеуважаемые.
Снова я. Сновас с трудностью и надеждой хоть какой-то подскзки)
Суть: Организовал softwareSerial между двумя девайсами. Команды устроены таким образом что одни идут с ПК конкретно на девайс 1, другие команды идут транзитом через 1-й второму. Причем отсылаю на аппаратный порт строку TX2690XT а тот понимает то нужно сделать и шлет его дальше на программный порт второму с изменением первой цифры чтобы тот принял команду. Первая цифра это адрес кому сообщение. Метки TX-XT маркеры пакета команды.
Кусочек активного кода. (Упрощен)
#include <ShiftRegister74HC595.h> #include <SoftwareSerial.h> SoftwareSerial softSerial(3, 4); // RX, TX int netReqpin = 19; int errSignalPin = 12; String rxData; //receive data buffer patriculator String rxCheck; //receive packer validator String netComm; // receive command (net - network) String netOutbuffer; // ouput data buffer. for what? i thing this is better than formatting directly in Serial.println("data"blablabla_vars) size? i don't know.... String netDatax; //received data in 3-rd section int netCommSwitch; //var for define 3-rd part of command stores a 0, 1, 3 difits (disable, enable + switch, error) int compare; //compare strings var for compare function for detect errore on receive int netCommdigit; //extracted from srting typed variable and converted to integer digit (tell about number of device) int devPinouts[61] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; //variable for store status of switchers&leds void setup() { Serial.begin(9600); softSerial.begin(9600); softSerial.println("Started///_W"); Serial.println("Write_module_started///"); pinMode(netReqpin, INPUT); pinMode(13, OUTPUT); } void loop() { readSerialDatax(); } void readSerialDatax() { //function for write data to another controller when he request that //if (digitalRead(netReqpin) == 1) //{ val = rxData; rxData = ""; netDatax = ""; netComm = ""; netCommdigit = 0; while (Serial.available()) //if we have something on serial buffer { char buff = Serial.read(); //read that rxData += buff; //add to string } while (softSerial.available()) //if we have something on serial buffer { char buff = softSerial.read(); //read that rxData += buff; //add to string } rxCheck = rxData.substring(0, 2); //copy portion of start string mark compare = rxCheck.compareTo("TX"); //compare to if (compare == 0) //if compare success { rxCheck = rxData.substring(6); //copy a ner end mark string portion to another variable compare = rxCheck.compareTo("XT"); //compare to if (compare == 0) //if start and end marks are ok { //packet valid, continue... if (rxData.substring(2, 3) == "3") //Read device address { netComm = rxData.substring(3, 5); //current number netCommdigit = netComm.toInt(); /////////////////////////////////////////////////////////optimize?! if (netCommdigit == 61) { //|00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 Serial.print("DISABLE---"); softSerial.println("DISABLE---"); sr.setAllLow(); for(int i=0; i<61; i++){ devPinouts[i] = 0; } } if (netCommdigit == 62) { //|00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 Serial.print("ENABLE---"); softSerial.println("ENABLE---"); sr.setAllHigh(); for(int i=0; i<61; i++){ devPinouts[i] = 1; } } if (netCommdigit > 20 && netCommdigit < 41) { netDatax = rxData.substring(5, 6); //this is define command or req if (netDatax == "0") { //this is an disable device command devPinouts[tS1] = 0; devPinouts[tS2] = 0; Serial.println("Off"); softSerial.println("Off"); } if (netDatax == "1") { devPinouts[tS1] ++; //do what we do } } } } if (compare != 0) //if compare fail (bad packet) { if (compare != -84) //-84 this is empty data, ignore this { //|00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 Serial.print("ERR receivening||| i receive: "); Serial.println(rxData); softSerial.print("ERR receivening.WRITER||| i receive: "); softSerial.println(rxData); rxData = ""; } } } delay(200); }
Такие пирожки. Проблема в том что я шлю с ПК комманду, та по идее принимается и дублируется с изменением адреса устройства (в нашем случае он 3) и шлет ее по программому порту. А тот пишет правильный пакет в ошибке. ERR receivening.WRITER||| i receive: TX3621XT
Прямое подключение рабоатет как нужно, транзит не понимает. Маркеры TX-XT на месте. Длина команды фиксированная. Что я упустил?
Ах да, я научил первый МК читать что отвечает второй МК. Поэтому я вывел ошибку. До этого я не смог подключиться через UART как снифер для прослушки обмена.
Краткий алгоритм разбора: Проверяем есть ли метки TX-XT на своих местах. Так и другие данные после проверки меток. Они смотрятся в первую очередь. Вывел метки отдельно и использую compareTo из-за того что просто сравнение не катит почемуто.
Если пакет меньше-больше - ошибка. Если повреждено начало-конец тоже. Только тело не имеет защиты. Да и не нужна она на мой взгляд в теле.
Неужели никто не сталкивался? Как вы парсите команды по серийному порту?
Начал играться.
Заменил сравненеие меркеров на startsWith и endsWith работает как надо.
Создаю удаленный serial сервер. Из самого сервера все понимается нормально. Шлю команду через putty в сервер к которому подключен serial - не понимает. В буфере команда правильная. Тоесть проблема в конкретном формате отправки?! Потому что ту же ошибку я получил и на аппаратном порте.
И тут тоже интересно. Подключаюсь к программному порту. Шлю с сервера. Все правильно. Шлю с удаленной консоли, не понимает снова. Тоесть проблема в самой передаче. Если напрямую с пк (сервера) понимает, то что не так в связке
мк - мк
Разобрался. Как хотите, можно тему и удалить. Если нет, тогда причина.
Отследил монитором и дошло. Использовались функции serial.println(blablabla) суть как раз в println. Он шлет вконце два байта, и какие же?! Правильно! CR-LF (0d 0a). В итоге было TX3621XT..
Только не доходит почему в старой проверке где была привязка к позиции символов последние два символа XT были на месте, и только потом эти две команды окончания строки. В общем загадка. Теперь проблему повторить не могу. Ну и ладно, нечего насиловать.
Изменение на Serial.print(blablabla); дало результат.