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

 
 
> Внутри Case не присваивается значение глобальной переменной, При вызове функции внутри Case
Димон Безпарольн...
сообщение Jul 31 2017, 13:07
Сообщение #1


Знающий
****

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



Весьма запутано, постараюсь объяснить.

Код
            case(OpenTCP):                        //Открытие TCP
                {                                //
                    printf("\rOpen TCP Session\r");//    
                    GSM_State_Mashine = ConnMQTT;//Успешно
                    GSM_Mashine_Errors = 0;        //
                    int T =    GPRSConnect1(TCP, MQTT_BROKER_SERVER, PORT, DEFAULT_TIMEOUT*8, DEFAULT_INTERCHAR_TIMEOUT*5);
                    if(!T)                         //
                        {                        //Не успешно
                            printf("\rError TCP Open... Try Again...\r");//    
                            int T =    GPRSClose();//
                            GSM_Mashine_Errors++;//
                            break;                //
                        }                        //
                    GSM_State_Mashine = ConnMQTT;//Успешно
                    GSM_Mashine_Errors = 0;        //
                    printf("\rTCP Session Open\r");//
                    break;                        //


Если ставить GSM_State_Mashine = ConnMQTT после вызова GPRSConnect1, то в переменной GSM_State_Mashine остается старое значение и этот case выполняется вечно.

Сама функция GPRSConnect1 и вызываемые ей функции никакого отношения к переменной GSM_State_Mashine не имеет. Причем перед выходом из функции, содержащей этот switch (GSM_State_Mashine) присвоение есть, но за ней (снаружи этой функции) эта переменная имеет старое значение!

Пока вышел из положения присваивая значение GSM_State_Mashine = ConnMQTT; до вызова функции. Так работает. После вызова - нет. Что ж за глюк такой?

Переменная объявлена глобальной volatile unsigned int GSM_State_Mashine = 0;//

Сообщение отредактировал Димон Безпарольный - Jul 31 2017, 13:10
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Димон Безпарольн...
сообщение Aug 6 2017, 15:04
Сообщение #2


Знающий
****

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



Не оптимизация и ничего таккого. В функции GPRSConnect есть вызов itoa1(port, num);.

Поскольку этой функции нет в библиотеке, я взял что - то подобное в Сети. С ней что - то не так, поскольку как только я блокирую этот вызов (не забыв в GPRSConnect поставить выход с положительным результатом return 1), машина состояний исправно переходит на следующий шаг.

Вот с этой функцией что - то не так:

Код
//---------------------------------------------------------------------------------------------------
void reverse(char s[])                            //reverse:  переворачиваем строку s на месте
{                                                //
    int i, j;                                    //
    char c;                                        //
    for (i = 0, j = strlen(s)-1; i<j; i++, j--)
        {                                        //
            c = s[i];                            //
            s[i] = s[j];                        //
            s[j] = c;                            //
        }                                        //
}                                                 //
//---------------------------------------------------------------------------------------------------
void itoa1(int n, char s[])                        //itoa:  конвертируем n в символы в s
{                                                //
    int i, sign;                                //
    if ((sign = n) < 0)                            //записываем знак
    n = -n;                                        //делаем n положительным числом
    i = 0;                                        //
    do                                            //генерируем цифры в обратном порядке
        {                                        //
            s[i++] = n % 10 + '0';                //берем следующую цифру
        }while ((n /= 10) > 0);                    //удаляем
    if (sign < 0)                                //
    s[i++] = '-';                                //
    s[i] = '\0';                                //
    reverse(s);                                    //
}                                                //


Попробую другие варианты из

https://electronix.ru/forum/index.php?showt...=142582&hl=

С ней все так. Эта функция преобразует номер порта 1883 в текст. Так вот, в вызове itoa1(port, num); под нее объявлен массив char num[4];
А нужно 5. Вероятно не хватило места для нуля. При объявлении char num[5]; все заработало исправно.



Сообщение отредактировал Димон Безпарольный - Aug 6 2017, 15:11
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Димон Безпарольный   Внутри Case не присваивается значение глобальной переменной   Jul 31 2017, 13:07
- - alexey123_45   А если в этом case поставить точку останова и пойт...   Jul 31 2017, 13:36
|- - Димон Безпарольный   Цитата(alexey123_45 @ Jul 31 2017, 17:36)...   Jul 31 2017, 15:11
- - kolobok0   Цитата(Димон Безпарольный @ Jul 31 2017, 16...   Jul 31 2017, 17:18
- - scifi   Напрашивается поставить на эту переменную watchpoi...   Jul 31 2017, 17:52
- - iosifk   Цитата(Димон Безпарольный @ Jul 31 2017, 16...   Jul 31 2017, 19:17
|- - Димон Безпарольный   Цитата(iosifk @ Jul 31 2017, 23:17) Ведь ...   Jul 31 2017, 19:35
|- - aaarrr   Цитата(iosifk @ Jul 31 2017, 22:17) А что...   Jul 31 2017, 20:53
|- - andrew_b   Цитата(iosifk @ Jul 31 2017, 22:17) Ведь ...   Aug 1 2017, 05:28
|- - Kabdim   Цитата(iosifk @ Jul 31 2017, 22:17) Ведь ...   Aug 1 2017, 09:37
|- - Димон Безпарольный   Цитата(Kabdim @ Aug 1 2017, 13:37) Либо U...   Aug 1 2017, 11:39
|- - Kabdim   Цитата(Димон Безпарольный @ Aug 1 2017, 14...   Aug 1 2017, 13:37
|- - Димон Безпарольный   Цитата(Kabdim @ Aug 1 2017, 17:37) Кстати...   Aug 1 2017, 14:36
|- - tvsdig   Теоретически может еще влиять включенная оптимизац...   Aug 1 2017, 19:54
|- - aaarrr   Цитата(tvsdig @ Aug 1 2017, 22:54) Теорет...   Aug 1 2017, 20:35
||- - AVI-crak   Кодcase(OpenTCP): //Открытие TCP ...   Aug 1 2017, 20:48
|- - Kabdim   Цитата(tvsdig @ Aug 1 2017, 22:54) Теорет...   Aug 2 2017, 09:29
|- - tvsdig   Цитата(Kabdim @ Aug 2 2017, 12:29) Не ста...   Aug 2 2017, 14:54
|- - Kabdim   Цитата(tvsdig @ Aug 2 2017, 17:54) Стараю...   Aug 2 2017, 15:10
- - Obam   А где здесь ARM? Треду именно что место в темах пр...   Aug 1 2017, 08:16
- - Aaron   берите map-файл проекта с расположением переменных...   Aug 1 2017, 12:29
- - KnightIgor   Цитата(Димон Безпарольный @ Jul 31 2017, 14...   Aug 2 2017, 15:19
- - x893   Это обсуждение курсовой 2 курса ? Какая то чушь. ...   Aug 2 2017, 15:30
- - Kabdim   Говнокод из интернета, экономия на спичках байтах,...   Aug 6 2017, 20:47


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

 


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


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