Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
3 / 3 / 1
Регистрация: 26.07.2013
Сообщений: 46

количество байт в порту c++ linux

26.07.2013, 14:32. Показов 2118. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.

Пытаюсь реализовать свой протокол передачи данных по COM порту и столкнулся с вопросом о том, а как же узнать сколько байт в порту уже принято перед чтением этих данных.

Объясняю для чего:
в получаемых пакетах данных (массив байт) в начале каждого пакета идет так называемая шапка длиной в 8 байт, все остальное непосредственно данные пакета.

а так как в шапке содержится информация о том, какова длина последующих данных, то возникает необходимость сначала получить необходимые 8 байт шапки пакета.

Ранее я всегда программировал на delphi и на С++ под linux начал буквально вчера.
можно сказать это всего лишь третий по счету написанный мною класс.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/////////////////////////////////////////////////////////////////////////////////////////
//
// Calligraff TTL protocol class
// Calligraff.Ru
//
/////////////////////////////////
 
#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>
#include <stdlib.h>
using namespace std;
 
class CCTTLProt
{
    private:
 
        int TTLHND;
        bool isHDR;
 
        void ReadCycleDo()
        {
            int RcvdDataLen;
            ReadingProcess = True;
            isHDR = false;
            do {
 
                RcvdDataLen = <КАК ЗДЕСЬ ПОЛУЧИТЬ КОЛИЧЕСТВО БАЙТ В ПОРТУ???>;
                if ( isHDR == true )
                {
                    if ( RcvdDataLen >= 8 )
                    {
                        // читаем только первые 8 байт
                    } else {
                        // Какие-то левые
                    }
                } else {
                    // читаем оставшиеся данные
                }
 
            } while( ReadingProcess != false );
        }
 
    public:
 
        bool ReadingProcess = false;
 
        bool Init(string Device)
        {
            TTLHND = open(Device.c_str(), O_RDWR | O_NOCTTY );
            if(! TTLHND ){
                fprintf( stderr, "ERROR: (open) %s\n", strerror( errno ) );
                return false;
            }
            struct termios options;
            tcgetattr(TTLHND, &options);            // Get options
            cfsetispeed(&options, B115200);         // Set input speed
            cfsetospeed(&options, B115200);         // Set output speed
            options.c_cflag &= ~PARENB;             // Do not use the parity bit
            options.c_cflag &= ~CSTOPB;             // Use one stop bit
            options.c_cflag &= ~CSIZE;              // 
            options.c_cflag |= CS8;                 // The number of bits at 1 byte
            options.c_cc[VMIN] = 1;                 // Minimum bytes
            options.c_cc[VTIME] = 10;               // Interval in 1/10 sec
            options.c_lflag = ICANON;               // Enable canonical input
            options.c_oflag = 0;                    // RAW output
            tcflush(TTLHND, TCIOFLUSH);
            tcsetattr(TTLHND, TCSANOW, &options);
 
            return true;
        };
 
        bool ReadCycle()
        {
            // ЗАПУСТИТЬ В ОТДЕЛЬНОМ ПОТОКЕ ПРОЦЕДУРУ
            ReadCycleDo();
            return true;
        }
 
        bool Close()
        {
            close(TTLHND);
            return true;
        };
};
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.07.2013, 14:32
Ответы с готовыми решениями:

Дан массив из 11 байт. Подсчитать количество байт с нечетным числом 1 в байте
Дан массив из 11 байт. Подсчитать количество байт с нечетным числом 1 в байте.-Assembler помогите пожалуйста

Дан массив из 10 байт. Посчитать количество байт, в которых сброшены 6 и 4 биты
Дан массив из 10 байт. Посчитать количество байт,в которых сброшены 6 и 4 биты. Массив байтов размещается начиная с DS:0000h. Ответ должен...

Дан массив из 6 байт. Посчитать количество байт число единиц, в которых не превышает 3.
Дан массив из 6 байт. Посчитать количество байт число единиц, в ко- торых не превышает 3. блин люди немогу сделать.

2
0 / 0 / 0
Регистрация: 19.09.2009
Сообщений: 9
31.07.2013, 09:11
Здравствуйте Calligraff. Тоже занялся работой с ком портом методами C++ на Linux среда разработки Eclipse на openSuse.
http://www.opennet.ru/docs/RUS... x.html#2_5 тут что то есть по Вашему вопросу если не ошибаюсь.
"Вызов FIONREAD ioctl получает число байтов в приемном буфере последовательного порта." У меня стоит задача адаптации кода
с win на Linux. Я столкнулся с проблемой открытия порта p = open("/dev/ttyS1",O_RDWR | O_NOCTTY | O_NDELAY);
нужны права SU. Как Вы решили эту проблему? В какой среде работаете?
0
3 / 3 / 1
Регистрация: 26.07.2013
Сообщений: 46
31.07.2013, 09:37  [ТС]
Цитата Сообщение от Konstantin1 Посмотреть сообщение
Здравствуйте Calligraff. Тоже занялся работой с ком портом методами C++ на Linux среда разработки Eclipse на openSuse.
http://www.opennet.ru/docs/RUS... x.html#2_5 тут что то есть по Вашему вопросу если не ошибаюсь.
"Вызов FIONREAD ioctl получает число байтов в приемном буфере последовательного порта." У меня стоит задача адаптации кода
с win на Linux. Я столкнулся с проблемой открытия порта p = open("/dev/ttyS1",O_RDWR | O_NOCTTY | O_NDELAY);
нужны права SU. Как Вы решили эту проблему? В какой среде работаете?
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
        bool Init(string Device)
        {
            TTLHND = open(Device.c_str(), O_RDWR | O_NOCTTY );
            if(! TTLHND ){
                fprintf( stderr, "ERROR: (open) %s\n", strerror( errno ) );
                return false;
            }
            struct termios options;
            tcgetattr(TTLHND, &options);            // Get options
            cfsetispeed(&options, B115200);         // Set input speed
            cfsetospeed(&options, B115200);         // Set output speed
            options.c_cflag &= ~PARENB;             // Do not use the parity bit
            options.c_cflag &= ~CSTOPB;             // Use one stop bit
            options.c_cflag &= ~CSIZE;              // 
            options.c_cflag |= CS8;                 // The number of bits at 1 byte
            options.c_cc[VMIN] = 1;                 // Minimum bytes
            options.c_cc[VTIME] = 10;               // Interval in 1/10 sec
            options.c_lflag = ICANON;               // Enable canonical input
            options.c_oflag = 0;                    // RAW output
            tcflush(TTLHND, TCIOFLUSH);
            tcsetattr(TTLHND, TCSANOW, &options);
            return true;
        };
 
        int main( int ArgC, char * ArgV[] )
        {
            CTTL.Init("/dev/ttyUSB0");
            return 0;
        };
Так реализовано у меня и работает
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.07.2013, 09:37
Помогаю со студенческими работами здесь

Дан массив из 10 байт. Посчитать количество байт содержащих ровно три единицы
Здравствуйте, возникла проблема с решением задачи: &quot;Дан массив из 10 байт. Посчитать количество байт содержащих ровно три...

Дан массив из 10 байт. Посчитать количество байт с числом единиц в байте равным три
помогите с задачкой! Дан массив из 10 байт. Посчитать количество байт с числом единиц в байте равным три.Вот код,но что тут не правильно...

Дан массив из 13 байт. Посчитать количество байт содержащих только нули или единицы
ПОЖАЛУЙСТА! РЕШИТЕ ЗАДАЧКИ!!!:) Задача №1 дан массив из 13 байт. посчитать количество байт содержащих только нули или единицы. ...

Посчитать в файле количество нулевых байт и различных байт
Посчитать в файле кол-во нулевых байт и различных байт Кто решит буду весьма благодарен!:drink:

Написать функцию, определяющую количество нулевых и количество различных байт в файле
Написать функцию, определяющую количество нулевых байт в файле, а также количество различных байт в файле. Помогите, пожалуйста, очень...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru