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

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

31.03.2017, 08:48. Просмотров 440. Ответов 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. Без циклов и массивов. Вова попал на космическом корабле на...

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

Хотите читать строку - читайте строку. UART_Gets, может быть? Или руками придется писать. И тогда да - именно по одной букве (что-то типа этого http://docs.ros.org/hydro/api/cob_3d...ce.html#l00081)
0
_SayHello
799 / 484 / 157
Регистрация: 30.07.2015
Сообщений: 1,600
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
1346 / 799 / 370
Регистрация: 12.05.2016
Сообщений: 2,162
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
1346 / 799 / 370
Регистрация: 12.05.2016
Сообщений: 2,162
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
1346 / 799 / 370
Регистрация: 12.05.2016
Сообщений: 2,162
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

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

Логическая операция
Даны три числа: А,В,С. Проверить истинность высказывания. число В находится между числами А и С....

Логическая операция
Вообщем дельфи соединен с бд акцес. в акцессе есть табличка "таблица" с атрибутами : цена,...

Логическая операция AND
Вот сижу и разбираюсь с логическим выражением AND Я ведь правильно понимаю, если логически...

ip адресация, логическая операция
Выполните логическую операцию «И» а) для IP-адреса и маски подсети отправителя ; б) для IP- адреса...


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

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

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