|
|
  |
Почему не работает чтение из буфера 2?, Из буфера 1 работает... |
|
|
|
Aug 7 2017, 08:03
|
Знающий
   
Группа: Участник
Сообщений: 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
|
|
|
|
|
Aug 7 2017, 13:08
|
Профессионал
    
Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528

|
Цитата static int PacketIDX = 0; Зачем там static?
--------------------
Russia est omnis divisa in partes octo.
|
|
|
|
|
Aug 7 2017, 14:17
|
Знающий
   
Группа: Участник
Сообщений: 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
|
|
|
|
|
Aug 7 2017, 17:39
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Aug 7 2017, 19:27
|
Знающий
   
Группа: Участник
Сообщений: 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
|
|
|
|
|
Aug 8 2017, 13:32
|
Участник

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

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