Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
megahertz
0 / 0 / 0
Регистрация: 27.02.2016
Сообщений: 11
1

логическая операция

31.03.2017, 08:48. Просмотров 428. Ответов 9
Метки нет (Все метки)

Только недавно начал изучать си, потому строго не судите, прошу помочь разобраться в решении вопроса, код и описание чуть ниже:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int main(void) {
  uint8_t q; /*пробовал char*/
    
    /*выводим текст в юарт */
    UART_Puts(UART1, "write a or test\n");
 
    
while (1) {
        /* читаем полученные данные */
        q = UART_Getc(UART1);
    if (q == 'a') { /*сравниваем, если введенная строка = a*/
            UART_Putc(UART1, q);  /*выводим в консоль то что ввели*/
            UART_Puts(UART1, "- ok!\n"); } /*говорим ok*/
                
else if (q == 'test1') { /*сравниваем, если введенная строка = test1*/
            UART_Putc(UART1, q);
                UART_Puts(UART1, "please try again!\n");    
                }
                else if(c) {
                    UART_Putc(UART1, q);
                }
Собственно сейчас при вводе одного символа, алгоритм отрабатывает как надо, но если пытаться ему скормить целиком слово, то программа отправляет слово по буквенно, т.е работает не правильно. Как правильно передать целую строку а не бить ее отдельно по символам?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.03.2017, 08:48
Ответы с готовыми решениями:

Логическая задача
Решить нужно с двумя if и else. Без циклов и массивов. Вова попал на космическом корабле на...

Логическая задача на Си
Решить нужно с двумя if и else. Без циклов и массивов. Вова попал на космическом корабле на...

Логическая ошибка в работе со строками
компилятор ошибки не ловит, а возвращает не то что надо. //считанный текст кодирует в свинячую...

Переменная Логическая выдает не ожидаемый результат
Добрый день! Обе переменные ложны, так почему он выдает мне Red balloon? #include <stdio.h>...

Библиотека обработки символов. Логическая ошибка
Первая функция с выбором работает правильно, все остальные функции обрабатываются через ELSE. Как...

9
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
6126 / 2919 / 790
Регистрация: 18.10.2014
Сообщений: 5,355
31.03.2017, 09:09 2
Цитата Сообщение от megahertz Посмотреть сообщение
то программа отправляет слово по буквенно, т.е работает не правильно
"Отправляет"? Нет, это у вас в программе чтение делается функцией UART_Getc, то есть по одной букве. Вы написали читать по одной букве - оно и читается по одной букве. Все, как и должно быть.

Хотите читать строку - читайте строку. UART_Gets, может быть? Или руками придется писать. И тогда да - именно по одной букве (что-то типа этого http://docs.ros.org/hydro/api/cob_3d...ce.html#l00081)
0
_SayHello
798 / 483 / 157
Регистрация: 30.07.2015
Сообщений: 1,596
31.03.2017, 10:34 3
megahertz, UART передает по одному символу, соответственно если вы в терминале ему закинули строку, то он разбил ее на байты и передал последовательно одну за другим. Для того чтобы считать строку вам надо ловить каждый байт и складывать в буффер. А потом уже буффер этот проверять.
0
megahertz
0 / 0 / 0
Регистрация: 27.02.2016
Сообщений: 11
31.03.2017, 12:18  [ТС] 4
TheCalligrapher, спасибо на наводку, плохо смотрел, сделал пока так:
C
1
2
  uint16_t q;
  char buffer[100];
C
1
q = UART_Gets(UART1, buffer, sizeof(buffer));
на чем пролез дальше но вспотыкнулся о
incompatible integer to pointer conversion passing 'uint16_t' (aka 'unsigned short') to parameter of type 'char *'

Добавлено через 1 час 29 минут
исправил, сделал так:
C
1
2
char q;
char buffer[100];
C
1
2
3
4
q = UART_Gets(UART1, buffer, sizeof(buffer));
            if (q == "test1") { 
            UART_Puts(UART1, buffer);
            UART_Puts(UART1, "- ok\n"); }
не совсем пойму где ошибка, как их правильно сравнить? нашел в гугле функцию strncmp, но неужели без нее никак?
0
shvyrevvg
1345 / 798 / 370
Регистрация: 12.05.2016
Сообщений: 2,161
31.03.2017, 12:31 5
Цитата Сообщение от megahertz Посмотреть сообщение
но неужели без нее никак
А как вы по другому массивы сравните? strcmp()

Добавлено через 1 минуту
C
1
if (strcmp(buffer, "test1")==0)
0
megahertz
0 / 0 / 0
Регистрация: 27.02.2016
Сообщений: 11
31.03.2017, 13:02  [ТС] 6
хз) вот и думал что может как то без нее можно, повесил эту функцию и вся проверка упала, сразу без чтения буфера сыпется - okokokokokokok

Добавлено через 16 минут
C
1
2
3
4
5
6
7
8
9
{ 
        
    if (UART_Gets(UART1, buffer, sizeof(buffer)))
    { UART_Puts(UART1, buffer); }
                if (strcmp(buffer, "test1")==0) {
                UART_Puts(UART1, "ok\n");
            }
                }
            }
очепятался, забыл { после if()
тем не менее что-то не работает ищу как решить
0
shvyrevvg
1345 / 798 / 370
Регистрация: 12.05.2016
Сообщений: 2,161
31.03.2017, 13:04 7
Цитата Сообщение от megahertz Посмотреть сообщение
повесил эту функцию и вся проверка упала, сразу без чтения буфера сыпется
Ну так если буфер нулями не инициализирован то конечно упадет(она же до '\0' сравнивает), тогда strncmp(buffer, "test1", 5)

Добавлено через 1 минуту
megahertz, весь код в студию.
0
megahertz
0 / 0 / 0
Регистрация: 27.02.2016
Сообщений: 11
31.03.2017, 13:12  [ТС] 8
код ниже
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main(void) {
    char buffer[100];
    SystemInit();
    DELAY_Init();
    UART_Puts(UART1, "Hello\n");
 
    while (1) { 
    if (UART_Gets(UART1, buffer, sizeof(buffer)))
    { UART_Puts(UART1, buffer); }
                if (strcmp(buffer, "test1",5)==0) {
                UART_Puts(UART1, "ok\n");
            }
                else if (strcmp(buffer, "test1")== NULL)
                {
                    UART_Puts(UART1, buffer);
                }
            }
        }
buffer, "test",5 нельзя так делать говорит error: too many arguments to function call, expected 2, have 3
0
shvyrevvg
1345 / 798 / 370
Регистрация: 12.05.2016
Сообщений: 2,161
31.03.2017, 13:21 9
Цитата Сообщение от megahertz Посмотреть сообщение
buffer, "test",5 нельзя так делать
megahertz, а если внимательно посмотреть? Подсказка: буковка n.

Добавлено через 1 минуту
Скорее всего '\n' на конце есть в буфере из-за этого такой результат у strcmp, используй strncmp.
0
megahertz
0 / 0 / 0
Регистрация: 27.02.2016
Сообщений: 11
31.03.2017, 14:14  [ТС] 10
Спасибо за помощь, вы мне очень помогли, думаю с остальным я разберусь)
0
31.03.2017, 14:14
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.03.2017, 14:14

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

лог.операция NOT
Подскажите пожалуст, вот програма: nA=25; //0000 0000 0001 1001 nB=~nA; //1111 1111...

Обратимая операция
Доброго времени суток, подскажите пожалуйста, как обратить данную операцию: int value = 0x2694;...

Битовая операция
Выполнить проверку заданного (вводится с клавиатуры) бита числа В и если заданный бит имеет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.