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

 
 
 
Reply to this topicStart new topic
> Почему не работает чтение из буфера 2?, Из буфера 1 работает...
Димон Безпарольн...
сообщение Aug 7 2017, 08:03
Сообщение #1


Знающий
****

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



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

Код
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}; //


Сообщение отредактировал Димон Безпарольный - Aug 7 2017, 08:05
Go to the top of the page
 
+Quote Post
SSerge
сообщение Aug 7 2017, 13:08
Сообщение #2


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

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата
static int PacketIDX = 0;

Зачем там static?


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Aug 7 2017, 14:17
Сообщение #3


Знающий
****

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



Цитата(SSerge @ Aug 7 2017, 17:08) *
Зачем там 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
Для продолжения нажмите любую клавишу . . .


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

Сообщение отредактировал Димон Безпарольный - Aug 7 2017, 14:17
Go to the top of the page
 
+Quote Post
adnega
сообщение Aug 7 2017, 14:35
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Димон Безпарольный @ Aug 7 2017, 17:17) *
Глупость, понимаю. Но не могу понять где накосячил.

А кто и когда обнуляет PacketIDX ?
Go to the top of the page
 
+Quote Post
SSerge
сообщение Aug 7 2017, 14:48
Сообщение #5


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

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Что эта функция вообще должна делать?


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
x893
сообщение Aug 7 2017, 16:01
Сообщение #6


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

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



static не нужен конечно
Второй случай смотрите отладчиком.
Кто то у вас затирает SUBACK_P нулями.

Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Aug 7 2017, 16:47
Сообщение #7


Знающий
****

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



Цитата(adnega @ Aug 7 2017, 18:35) *
А кто и когда обнуляет PacketIDX ?

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

Go to the top of the page
 
+Quote Post
x893
сообщение Aug 7 2017, 17:35
Сообщение #8


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

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Если static добавить, то работать будет неправильно и будет выход за границу.
Возьмите карандаш с бумажкой и промоделируйте работу программы.
Можно книжками заменить про язык С.
Go to the top of the page
 
+Quote Post
dm37
сообщение Aug 7 2017, 17:39
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 14-08-16
Пользователь №: 92 949



У вас всё работает так как вы и написали. Т.е. если не сбрасывать 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 - Aug 7 2017, 17:40
Go to the top of the page
 
+Quote Post
x893
сообщение Aug 7 2017, 17:46
Сообщение #10


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

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Сделать можно как угодно, но телепатия пока не доступна простым начинающим типа меня.
Как сейчас нарисовано, то конечно могут быть ошибки при выходе за границы.
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Aug 7 2017, 19:27
Сообщение #11


Знающий
****

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



Цитата(x893 @ Aug 7 2017, 21:35) *
Если static добавить, то работать будет неправильно и будет выход за границу.
Возьмите карандаш с бумажкой и промоделируйте работу программы.
Можно книжками заменить про язык С.

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

Код
    if(PacketIDX >=3) {PacketIDX = 0;}


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

Сообщение отредактировал Димон Безпарольный - Aug 7 2017, 19:27
Go to the top of the page
 
+Quote Post
x893
сообщение Aug 8 2017, 01:29
Сообщение #12


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

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Тогда логику надо изменить.
Go to the top of the page
 
+Quote Post
Kibi
сообщение Aug 8 2017, 13:32
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 11-03-08
Пользователь №: 35 811



Эм, а не проще ли switch(PacketIDX), просто как то странно из кучи последовательных ифоф, особенно когда байт много и при каждом проходе нужно обращаться к определенному по номеру байту, хотя может неправильно понял задачу.
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Aug 8 2017, 14:19
Сообщение #14


Знающий
****

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



Цитата(Kibi @ Aug 8 2017, 17:32) *
Эм, а не проще ли switch(PacketIDX), просто как то странно из кучи последовательных ифоф, особенно когда байт много и при каждом проходе нужно обращаться к определенному по номеру байту, хотя может неправильно понял задачу.

Можно. switch(PacketIDX) или ИФ переключает тип протокола. По нему выбирается строка. И так и так можно. Только протоколов всего 5 будет.
Go to the top of the page
 
+Quote Post
x893
сообщение Aug 8 2017, 14:46
Сообщение #15


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

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Я бы на этот вопрос
"Почему не работает ... ?"
ответил так
Логику надо улучшать
Go to the top of the page
 
+Quote Post

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

 


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


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