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

 
 
> Еще одна проблема с CASE, Кажется стек.
Димон Безпарольн...
сообщение Aug 6 2017, 18:33
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Пытался вынести кусок кода из CASE в отдельную функцию:


Код
void MQTT_Connect(void)                            //
{                                                //
    int rc;                                        //
    unsigned char buf[200];                        //
    unsigned char readbuf[100];                    //
    MQTTClient(&c, 20000, buf, 200, readbuf, 100);
    MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
    data.willFlag = 0;                            //Данные прописаны в MQTT.h
    data.MQTTVersion = MQTTVersioN;                //
    data.clientID.cstring = MQTTClientID;        //
    data.username.cstring = MQTTUsername;        //
    data.password.cstring = MQTTPassword;        //
    data.keepAliveInterval = MQTTKeepAliveInterval;//
    data.cleansession = MQTTCleansession;        //
    printf("\rConnect to MQTT Brocker\r");        //
    if ( (rc = MQTTConnect(&c, &data)) != 0)    //
        {                                          //Не успешно
            printf("\rClient connection with IBM MQTT broker failed with Error Code %d\r", (int)rc);
            switch (rc)                            //
                {                                //
                    case C_REFUSED_PROT_V:        //
                        {                        //
                            printf("Connection Refused, unacceptable protocol version\r");
                            break;                //
                        }                        //
                    case C_REFUSED_ID:            //
                        {                        //
                            printf("Connection Refused, identifier rejected\r");
                            break;                //
                        }                        //
                    case C_REFUSED_SERVER:        //
                        {                        //
                            printf("Connection Refused, Server unavailable\r");
                            break;                //
                        }                        //
                    case C_REFUSED_UID_PWD:        //
                        {                        //
                            printf("Connection Refused, bad user name or password\r");
                            break;                //
                        }                        //
                    case C_REFUSED_UNAUTHORIZED://
                        {                        //
                            printf("Connection Refused, not authorized\r");
                            break;                //
                        }                        //
                }                                 //
            printf("\rMQTT Error.. Try again... %d\r", GSM_Mashine_Errors++);//    
            return;                                //
        }                                         //
    else                                         //Успешно
        {                                         //
            printf("\rConnected with IBM MQTT broker\r");
//Подписка
            char* Topic = MQTTSubscribeTopic;    //
            printf("\rSubscribing topic: %s\r", Topic);
            if( MQTTSubscribe(&c, Topic, QOS0, messageArrived) < 0)
                {                                //
                    printf("\rSubscribe with IBM MQTT broker failed\r");
                }                                 //
            else                                 //
                {                                //
                    printf("\rSubscribed to topic: %s\r", Topic);
                }                                //
            GSM_Mashine_Errors=0;                //
            GSM_State_Mashine = PubMQTT;        //Успешно
        }                                         //else if( (rc = MQTTConnect(&c, &data)) != 0)
                    
        
}



Код выполняется, но в следующем шаге все виснет на вызове int T1 = MQTTPublish(&c,(char*)"iot-2/evt/status/fmt/json", &MQTT_msg);
Ковыряя эту функцию обнаружил что выхода из функции
Код
int MQTTSerialize_publish(unsigned char* buf, int buflen, unsigned char dup, int qos, unsigned char retained, unsigned short packetid,
        MQTTString topicName, unsigned char* payload, int payloadlen)


в нужное место не происходит. Т.е. выполнение доходит до return rc; в любом случае, но в вызывающий процесс не возвращается. Но если в теле этой функции блокировать следующий код:

Код
/*        
    writeMQTTString(&ptr, topicName);
        
        
    if (qos > 0)
        writeInt(&ptr, packetid);
    
    memcpy(ptr, payload, payloadlen);
*/


То выход из функции исправно происходит. Учитывая что код рабочий (на 99%) на ум приходит только нехватка памяти. Что в этом случае делать?

Сообщение отредактировал Димон Безпарольный - Aug 6 2017, 18:40
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
HardEgor
сообщение Aug 6 2017, 18:41
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 223
Регистрация: 3-03-06
Из: Tomsk
Пользователь №: 14 925



Цитата(Димон Безпарольный @ Aug 7 2017, 01:33) *
То выход из функции исправно происходит. Учитывая что код рабочий (на 99%) на ум приходит только нехватка памяти. Что в этом случае делать?

А причем здесь case?
Что делать? Есть два варианта:
- не пользоваться функцией MQTTSerialize_publish
- исправить код функции, чтобы memcpy не затирал память переменной rc .
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Aug 6 2017, 18:44
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Цитата(HardEgor @ Aug 6 2017, 22:41) *
А причем здесь case?
Что делать? Есть два варианта:
- не пользоваться функцией MQTTSerialize_publish
- исправить код функции, чтобы memcpy не затирал память переменной rc .

При том, что если код находится в CASE все исправно работает. Я может быть и не прав, дело не в этом, но найти в чем пока не могу. Не пользоваться функцией не могу, а исправить рабочий код... тоже не могу.

Можно было бы и так оставить, но боюсь что в будущем этот невидимый косяк мне аукнется.

Сообщение отредактировал Димон Безпарольный - Aug 6 2017, 18:46
Go to the top of the page
 
+Quote Post
HardEgor
сообщение Aug 6 2017, 21:16
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 223
Регистрация: 3-03-06
Из: Tomsk
Пользователь №: 14 925



Цитата(Димон Безпарольный @ Aug 7 2017, 01:44) *
Можно было бы и так оставить, но боюсь что в будущем этот невидимый косяк мне аукнется.

Угу, где-то в другом месте затирает, пока не критичном....
Go to the top of the page
 
+Quote Post
Alechek
сообщение Aug 7 2017, 12:38
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



Цитата(Димон Безпарольный @ Aug 6 2017, 23:33) *
Пытался вынести кусок кода из CASE в отдельную функцию:

Код
void MQTT_Connect(void)                            //
{                                                //
    int rc;                                        //
    unsigned char buf[200];                        //
    unsigned char readbuf[100];                    //


Опть.... Это правда так надо, динамически выделять такие объемы из стека?
Глядя на такое, вопрос по нехватке памяти должен отпасть сам.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 23:05
Рейтинг@Mail.ru


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