Russian Qt Forum
Ноябрь 22, 2024, 23:59 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Прием данных из COM порта в коде МТК  (Прочитано 10292 раз)
VAP
Гость
« : Сентябрь 26, 2008, 22:54 »

Доброго времени суток всем!

Использую qextserialport -1.0
Устанавливаю настройки порта:

Baud110;
DataBitsType = DATA_5;
ParityType=No;
StopBitsType=1,5;
FlowType=No

Код чтения данных в потоке:
Код:
void ThreadPort::run()
{
        quint8  ch;
        ………….
        QDataStream stream(port);
        stream.setVersion(QDataStream::Qt_4_1);
        stream.setDevice(port);
        stream.setByteOrder(QDataStream::LittleEndian);
        char buf_r[1];
        int numBytes;
        numBytes = port->bytesAvailable();
        if (numBytes > 0) {
numBytes = 1;
             stream >> ch;
             stream.readRawData(buf_r, numBytes);
             int i = port->read(buf_r, numBytes);
             if (i != -1) 
                  buf_r[i] = '\0'; 
             ………………..     

        А  вот дальше вопрос, как декодировать прочтенные данные:
        Кроме чтения данных из порта нужно еще и передавать их в порт, также в коде МТК.
       
        Если кто-то сталкивался с этим, прошу совета.
       

« Последнее редактирование: Сентябрь 28, 2008, 14:47 от pastor » Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Сентябрь 28, 2008, 14:51 »

Что такое МТК? Международный телеграфный код?
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
VAP
Гость
« Ответ #2 : Сентябрь 28, 2008, 15:46 »

Совершенно верно телеграграфный код старт-стоповый с 5 битами данных. Идет посимвольная передача данных и каждый символ состоит из 5 бит (например 11000 - ''А") , но русский и латинский шрифты меняются через символ смены регистра РУС на ЛАТ, третий ЦИФ. 
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #3 : Сентябрь 28, 2008, 16:20 »

Цитировать
А  вот дальше вопрос, как декодировать прочтенные данные.

Дикодировать можно при помощи таблицы:

http://www.cultinfo.ru/fulltext/1/001/009/001/226353127.jpg
http://ru.wikipedia.org/wiki/МТК-2

Читам из порта (буффера) код и анализируем что мы получаем (согласно таблице кодов). Для кодирования также пользуемся таблицей: берем симбол, поучаем код и пишем в порт.


имхо алгоритм простой. Или у вас возникают проблемы в чем-то другом?
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
VAP
Гость
« Ответ #4 : Сентябрь 28, 2008, 16:44 »

Ничего другое не придумал, кроме как читать как-то вот так:
(для quint8 ch из кода выше)

if (ch == 0x18)
    str += "А";
и т.д.

Но так не получится, потому приводя к виду QString нужно иметь 32 бита?
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #5 : Сентябрь 28, 2008, 16:48 »

А можно более конкретно описать проблему?
Как я понял, получили массив байт, а дальше с помощью сдвигов и лог.операций читаем по 5 бит и декодируем...
В чем сложность? Или Вам нужен алгоритм чтения по 5 бит?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
VAP
Гость
« Ответ #6 : Сентябрь 28, 2008, 16:58 »

Именно это и нужно, чтение 5 бит, и приводить согласно таблицы кодировок к классу QString для вывода в QTextEdit.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #7 : Сентябрь 28, 2008, 17:06 »

Ничего другое не придумал, кроме как читать как-то вот так:
(для quint8 ch из кода выше)

if (ch == 0x18)
    str += "А";
и т.д.

Учитывая что таблица кодов - это константа, в программе можно объявить в виде QMap для декодирования:

QMap<quint8, QString> decodeTable;

т.е. получится т.н. таблица соответствий.

Использование:

Цитировать
//init decodeTable
...
QString str;
.....
str += decodeTable.value(ch);
...
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #8 : Сентябрь 28, 2008, 17:13 »

Именно это и нужно, чтение 5 бит

А как передаються данные с другого конца линии? Есть какой либо протокол передачи? Какой размер пакета?
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
VAP
Гость
« Ответ #9 : Сентябрь 28, 2008, 17:26 »

Спасибо Pastor за хороший совет, обязательно испробую, в домашних условиях невозможно проверить.

скорость телеграфирования 100 бод, синхронизация знаков стартстопная, длина пакетов постоянная:
есть подводный камень со стартовым битом. Когда буду видеть, что принимаю, тогда будет больше ясности.
 
Записан
Вячеслав
Гость
« Ответ #10 : Октябрь 31, 2008, 22:18 »

а нескромный вопрос - к _чему_ присобачен этот ком ? Я как-то имел дело с телекс-модемами - но ..
1) там была сначала бааальшая банудра (Урал Непонимающий ) которая преобразовывала прямой хвост с телеграфа к чему-то что жрал модем ...
2) сам модем (если не ошибаюсь альфа-телекс) - работал с  рс на стандарных скоростях 19200 и 9600 8N1 и мог работать с пакетной и прямой передачей ..... (и он уже перекидывал мтк в ascii)
3) Насколько мне помниться в тех таблицах что я видел в доке к мудему( и брал на телеграфе) , когда этим интересовался были еще команды смены регистра ... таки IMHO прямая перекодировка не пойдет ...
4) а точно 100 бод а не 55 ?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.06 секунд. Запросов: 22.