Перейти к содержанию
    

Почему не работает чтение из буфера 2?

Написал код подстановки в функцию чтения из последовательного порта:

 

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}; //

Изменено пользователем Димон Безпарольный

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Зачем там 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

Для продолжения нажмите любую клавишу . . .

 

Глупость, понимаю. Но не могу понять где накосячил.

Изменено пользователем Димон Безпарольный

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Глупость, понимаю. Но не могу понять где накосячил.

А кто и когда обнуляет PacketIDX ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

static не нужен конечно

Второй случай смотрите отладчиком.

Кто то у вас затирает SUBACK_P нулями.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А кто и когда обнуляет PacketIDX ?

Так его вроде и обнулять не надо. При старте static int PacketIDX = 0; а дальше присвоение PacketPntr = CONNACK_P.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если static добавить, то работать будет неправильно и будет выход за границу.

Возьмите карандаш с бумажкой и промоделируйте работу программы.

Можно книжками заменить про язык С.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У вас всё работает так как вы и написали. Т.е. если не сбрасывать 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;
    }

...

Изменено пользователем dm37

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сделать можно как угодно, но телепатия пока не доступна простым начинающим типа меня.

Как сейчас нарисовано, то конечно могут быть ошибки при выходе за границы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если static добавить, то работать будет неправильно и будет выход за границу.

Возьмите карандаш с бумажкой и промоделируйте работу программы.

Можно книжками заменить про язык С.

Именно так. Первый пакет читался правильно, поскольку PacketIDX = 0. Второй - уже не правильно. Но сложность в том, что текущий принятый пакет внешние функции должны читать по частям. Т.е. первое обращение - 1 байт, второе обращение - 2 байта. Вышел из положения добавив:

 

    if(PacketIDX >=3) {PacketIDX = 0;}

 

Учитывая что пакет в данном случае пока трехбайтовый. И заработало. Извиняюсь что заморочил людям голову. Об этом мог знать только я. Проблемы с памятью все же есть, но они в других местах. А я подумал что и в этом...

Изменено пользователем Димон Безпарольный

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Эм, а не проще ли switch(PacketIDX), просто как то странно из кучи последовательных ифоф, особенно когда байт много и при каждом проходе нужно обращаться к определенному по номеру байту, хотя может неправильно понял задачу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Эм, а не проще ли switch(PacketIDX), просто как то странно из кучи последовательных ифоф, особенно когда байт много и при каждом проходе нужно обращаться к определенному по номеру байту, хотя может неправильно понял задачу.

Можно. switch(PacketIDX) или ИФ переключает тип протокола. По нему выбирается строка. И так и так можно. Только протоколов всего 5 будет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я бы на этот вопрос

"Почему не работает ... ?"

ответил так

Логику надо улучшать

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...