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

 
 
> Почему не работает чтение из буфера 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
 
Start new topic
Ответов
x893
сообщение Aug 7 2017, 17:35
Сообщение #2


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

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



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


Знающий
****

Группа: Участник
Сообщений: 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

Сообщений в этой теме
- Димон Безпарольный   Почему не работает чтение из буфера 2?   Aug 7 2017, 08:03
- - SSerge   Цитатаstatic int PacketIDX = 0; Зачем там static?   Aug 7 2017, 13:08
|- - Димон Безпарольный   Цитата(SSerge @ Aug 7 2017, 17:08) Зачем ...   Aug 7 2017, 14:17
|- - adnega   Цитата(Димон Безпарольный @ Aug 7 2017, 17...   Aug 7 2017, 14:35
|- - Димон Безпарольный   Цитата(adnega @ Aug 7 2017, 18:35) А кто ...   Aug 7 2017, 16:47
- - SSerge   Что эта функция вообще должна делать?   Aug 7 2017, 14:48
- - x893   static не нужен конечно Второй случай смотрите отл...   Aug 7 2017, 16:01
- - dm37   У вас всё работает так как вы и написали. Т.е. есл...   Aug 7 2017, 17:39
- - x893   Сделать можно как угодно, но телепатия пока не дос...   Aug 7 2017, 17:46
- - x893   Тогда логику надо изменить.   Aug 8 2017, 01:29
- - Kibi   Эм, а не проще ли switch(PacketIDX), просто как то...   Aug 8 2017, 13:32
|- - Димон Безпарольный   Цитата(Kibi @ Aug 8 2017, 17:32) Эм, а не...   Aug 8 2017, 14:19
- - x893   Я бы на этот вопрос "Почему не работает ... ?...   Aug 8 2017, 14:46


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

 


RSS Текстовая версия Сейчас: 29th July 2025 - 03:34
Рейтинг@Mail.ru


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