M
mhamini
Guest
Я намагаюся обробити потік бітів даних, які, як це відбувається приходить в через послідовний порт.Даних здійснюється у формі кілька типів пакетів, і я хочу просто розширює основи для обробки і додати кілька типів пакетів.
Для спрощеної приклад, який я зробив, ось приклад рішення ...
# Включити <fstream>
# Включити <iostream>
з використанням імен:: зЬй;
/ / Пакет формату 0x33, 0x44, [Packtype], [даних], [даних], [дані]
/ / Трохи фіктивними даними на передній і задній
непідписані символ даних [] = (0x11, 0x23, 0x34, 0x33, 0x44, 0x01, 0x00, 0x00, 0x00, 0x00, 0x32, 0x45, 0x33, 0x44, 0x02, 0x12, 0x54, 0xA1, 0xBC, 0x11);
класу Pack1
(
громадськості:
сЬаг даними [3];
);
класу Pack2
(
громадськості:
сЬаг даних [5];
);
WriteData недійсними ()
(
ofstream OFS ("test.dat", IOS:: бінарний);
ofs.write ((символ *) і дані, sizeof (дані));
)
п ()
(
символ с;
Int заголовок = 0;
/ / WriteData ();
геат "якщо" ("test.dat", IOS:: бінарний);
а (ifs.get (с)) (
якщо ((заголовок == 0) і і (з == 0x33)) (/ / отримали першу частину заголовка пакету
символ D = ifs.peek ();
якщо (р == 0x44) (
ifs.get (); / / Отримання і відкинути 2ns байт заголовка
заголовок = 1;
/ / З'ясувати, який пакет
з = ifs.peek ();
якщо (з == 0x01) (
суд <<"Got Pack1" <<епсІ;
Pack1 р1;
ifs.read ((символ *) і p1, sizeof (p1));
заголовок = 0;
) Останнє, якщо (з == 0x02) (
суд <<"Got Pack2" <<епсІ;
Pack2 Р2;
ifs.read ((символ *) і р2, sizeof (Р2));
заголовок = 0;
)
)
)
)
повернення 0;
)
Дає ....
Got Pack1
Got pack2
Для мене це виглядає дуже непривабливо спосіб зробити це.Безумовно, є деякі корисні інкапсулірованние спосіб визначення та перевірки пакетів, які ми отримали.Я шукаю консультації за найкращою мишоловці це зробити.Хто-небудь є фрагменти коду, які могли б допомогти?Як фундаментальних систем цьому є обробки повідомлень TCPIP, безумовно, це вишуканий, щоб прекрасне рішення.
Для спрощеної приклад, який я зробив, ось приклад рішення ...
# Включити <fstream>
# Включити <iostream>
з використанням імен:: зЬй;
/ / Пакет формату 0x33, 0x44, [Packtype], [даних], [даних], [дані]
/ / Трохи фіктивними даними на передній і задній
непідписані символ даних [] = (0x11, 0x23, 0x34, 0x33, 0x44, 0x01, 0x00, 0x00, 0x00, 0x00, 0x32, 0x45, 0x33, 0x44, 0x02, 0x12, 0x54, 0xA1, 0xBC, 0x11);
класу Pack1
(
громадськості:
сЬаг даними [3];
);
класу Pack2
(
громадськості:
сЬаг даних [5];
);
WriteData недійсними ()
(
ofstream OFS ("test.dat", IOS:: бінарний);
ofs.write ((символ *) і дані, sizeof (дані));
)
п ()
(
символ с;
Int заголовок = 0;
/ / WriteData ();
геат "якщо" ("test.dat", IOS:: бінарний);
а (ifs.get (с)) (
якщо ((заголовок == 0) і і (з == 0x33)) (/ / отримали першу частину заголовка пакету
символ D = ifs.peek ();
якщо (р == 0x44) (
ifs.get (); / / Отримання і відкинути 2ns байт заголовка
заголовок = 1;
/ / З'ясувати, який пакет
з = ifs.peek ();
якщо (з == 0x01) (
суд <<"Got Pack1" <<епсІ;
Pack1 р1;
ifs.read ((символ *) і p1, sizeof (p1));
заголовок = 0;
) Останнє, якщо (з == 0x02) (
суд <<"Got Pack2" <<епсІ;
Pack2 Р2;
ifs.read ((символ *) і р2, sizeof (Р2));
заголовок = 0;
)
)
)
)
повернення 0;
)
Дає ....
Got Pack1
Got pack2
Для мене це виглядає дуже непривабливо спосіб зробити це.Безумовно, є деякі корисні інкапсулірованние спосіб визначення та перевірки пакетів, які ми отримали.Я шукаю консультації за найкращою мишоловці це зробити.Хто-небудь є фрагменти коду, які могли б допомогти?Як фундаментальних систем цьому є обробки повідомлень TCPIP, безумовно, це вишуканий, щоб прекрасне рішення.