Димон Безпарольный 2 7 августа, 2017 Опубликовано 7 августа, 2017 (изменено) · Жалоба Написал код подстановки в функцию чтения из последовательного порта: int spwf_socket_read (unsigned char* i, int ch, int timeout) { // unsigned char *PacketPntr = NULL; // static int PacketIDX = 0; // int dataLen = 0; // //printf("\nPacketType = %d:", PacketSwitch);// printf("\nAsking NByte = %d:", ch); // if(PacketSwitch == 2) // { // PacketPntr = CONNACK_P; // printf("IDX = %d:", PacketPntr); // } // if(PacketSwitch == 9) // { // PacketPntr = SUBACK_P; // printf("IDX = %d:", PacketPntr); // } // while(1) // { // i[dataLen] = PacketPntr[PacketIDX++];//Кладем в буфер printf("%02x ", i[dataLen]); // dataLen++; // if(dataLen >= ch) {break;} //Если принято сколько сказано (int ch) - выход } // return dataLen; // } // В первом случае (PacketSwitch == 2), код работает исправно. Во втором случае читаются нули: Connect to MQTT Brocker Asking NByte = 1:IDX = 4235388:20 Asking NByte = 1:IDX = 4235388:02 Asking NByte = 2:IDX = 4235388:00 00 Connected with IBM MQTT broker Subscribing topic: iot-2/cmd/rele/fmt/json Asking NByte = 1:IDX = 4235392:00 Asking NByte = 1:IDX = 4235392:00 MQTTSubscribe. Timeout expired for suback reception Массивы объявлены глобально. Можно и локально, будет то же самое. unsigned char CONNACK_P[4] = {0x20,0x02,0,0}; // unsigned char SUBACK_P [4] = {0x90,0x03,0,0}; // Изменено 7 августа, 2017 пользователем Димон Безпарольный Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 6 7 августа, 2017 Опубликовано 7 августа, 2017 · Жалоба static int PacketIDX = 0; Зачем там static? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Димон Безпарольный 2 7 августа, 2017 Опубликовано 7 августа, 2017 (изменено) · Жалоба Зачем там static? Согласен не нужен. Но без него еще хуже: Connect to MQTT Brocker Asking NByte = 1:IDX = 4235388:20 Asking NByte = 1:IDX = 4235388:20 Asking NByte = 32:IDX = 4235388:20 02 00 00 90 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Client connection with IBM MQTT broker failed with Error Code 2 Connection Refused, identifier rejected MQTT Error.. Try again... 0 Для продолжения нажмите любую клавишу . . . Глупость, понимаю. Но не могу понять где накосячил. Изменено 7 августа, 2017 пользователем Димон Безпарольный Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 7 августа, 2017 Опубликовано 7 августа, 2017 · Жалоба Глупость, понимаю. Но не могу понять где накосячил. А кто и когда обнуляет PacketIDX ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 6 7 августа, 2017 Опубликовано 7 августа, 2017 · Жалоба Что эта функция вообще должна делать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 60 7 августа, 2017 Опубликовано 7 августа, 2017 · Жалоба static не нужен конечно Второй случай смотрите отладчиком. Кто то у вас затирает SUBACK_P нулями. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Димон Безпарольный 2 7 августа, 2017 Опубликовано 7 августа, 2017 · Жалоба А кто и когда обнуляет PacketIDX ? Так его вроде и обнулять не надо. При старте static int PacketIDX = 0; а дальше присвоение PacketPntr = CONNACK_P. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 60 7 августа, 2017 Опубликовано 7 августа, 2017 · Жалоба Если static добавить, то работать будет неправильно и будет выход за границу. Возьмите карандаш с бумажкой и промоделируйте работу программы. Можно книжками заменить про язык С. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dm37 0 7 августа, 2017 Опубликовано 7 августа, 2017 (изменено) · Жалоба У вас всё работает так как вы и написали. Т.е. если не сбрасывать PacketIDX, то при выборке из второго массива будет считываться не элемент 0, а элемент 4 можно, как вариант сделать так: unsigned char *PacketPntr = NULL; // static int PacketIDX = 0; // static int packet_switch = 0; int dataLen = 0; // //printf("\nPacketType = %d:", PacketSwitch);// printf("\nAsking NByte = %d:", ch); // if(packet_switch != PacketSwitch) { PacketIDX = 0; packet_switch = PacketSwitch; } ... Изменено 7 августа, 2017 пользователем dm37 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 60 7 августа, 2017 Опубликовано 7 августа, 2017 · Жалоба Сделать можно как угодно, но телепатия пока не доступна простым начинающим типа меня. Как сейчас нарисовано, то конечно могут быть ошибки при выходе за границы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Димон Безпарольный 2 7 августа, 2017 Опубликовано 7 августа, 2017 (изменено) · Жалоба Если static добавить, то работать будет неправильно и будет выход за границу. Возьмите карандаш с бумажкой и промоделируйте работу программы. Можно книжками заменить про язык С. Именно так. Первый пакет читался правильно, поскольку PacketIDX = 0. Второй - уже не правильно. Но сложность в том, что текущий принятый пакет внешние функции должны читать по частям. Т.е. первое обращение - 1 байт, второе обращение - 2 байта. Вышел из положения добавив: if(PacketIDX >=3) {PacketIDX = 0;} Учитывая что пакет в данном случае пока трехбайтовый. И заработало. Извиняюсь что заморочил людям голову. Об этом мог знать только я. Проблемы с памятью все же есть, но они в других местах. А я подумал что и в этом... Изменено 7 августа, 2017 пользователем Димон Безпарольный Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 60 8 августа, 2017 Опубликовано 8 августа, 2017 · Жалоба Тогда логику надо изменить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kibi 0 8 августа, 2017 Опубликовано 8 августа, 2017 · Жалоба Эм, а не проще ли switch(PacketIDX), просто как то странно из кучи последовательных ифоф, особенно когда байт много и при каждом проходе нужно обращаться к определенному по номеру байту, хотя может неправильно понял задачу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Димон Безпарольный 2 8 августа, 2017 Опубликовано 8 августа, 2017 · Жалоба Эм, а не проще ли switch(PacketIDX), просто как то странно из кучи последовательных ифоф, особенно когда байт много и при каждом проходе нужно обращаться к определенному по номеру байту, хотя может неправильно понял задачу. Можно. switch(PacketIDX) или ИФ переключает тип протокола. По нему выбирается строка. И так и так можно. Только протоколов всего 5 будет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 60 8 августа, 2017 Опубликовано 8 августа, 2017 · Жалоба Я бы на этот вопрос "Почему не работает ... ?" ответил так Логику надо улучшать Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться