Russian Qt Forum

Qt => Дополнительные компоненты => Тема начата: VAP от Сентябрь 26, 2008, 22:54



Название: Прием данных из COM порта в коде МТК
Отправлено: 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'; 
             ………………..     

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



Название: Re: Прием данных из COM порта в коде МТК
Отправлено: pastor от Сентябрь 28, 2008, 14:51
Что такое МТК? Международный телеграфный код?


Название: Re: Прием данных из COM порта в коде МТК
Отправлено: VAP от Сентябрь 28, 2008, 15:46
Совершенно верно телеграграфный код старт-стоповый с 5 битами данных. Идет посимвольная передача данных и каждый символ состоит из 5 бит (например 11000 - ''А") , но русский и латинский шрифты меняются через символ смены регистра РУС на ЛАТ, третий ЦИФ. 


Название: Re: Прием данных из COM порта в коде МТК
Отправлено: pastor от Сентябрь 28, 2008, 16:20
Цитировать
А  вот дальше вопрос, как декодировать прочтенные данные.

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

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

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


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


Название: Re: Прием данных из COM порта в коде МТК
Отправлено: VAP от Сентябрь 28, 2008, 16:44
Ничего другое не придумал, кроме как читать как-то вот так:
(для quint8 ch из кода выше)

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

Но так не получится, потому приводя к виду QString нужно иметь 32 бита?


Название: Re: Прием данных из COM порта в коде МТК
Отправлено: Racheengel от Сентябрь 28, 2008, 16:48
А можно более конкретно описать проблему?
Как я понял, получили массив байт, а дальше с помощью сдвигов и лог.операций читаем по 5 бит и декодируем...
В чем сложность? Или Вам нужен алгоритм чтения по 5 бит?


Название: Re: Прием данных из COM порта в коде МТК
Отправлено: VAP от Сентябрь 28, 2008, 16:58
Именно это и нужно, чтение 5 бит, и приводить согласно таблицы кодировок к классу QString для вывода в QTextEdit.


Название: Re: Прием данных из COM порта в коде МТК
Отправлено: pastor от Сентябрь 28, 2008, 17:06
Ничего другое не придумал, кроме как читать как-то вот так:
(для quint8 ch из кода выше)

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

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

QMap<quint8, QString> decodeTable;

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

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

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


Название: Re: Прием данных из COM порта в коде МТК
Отправлено: pastor от Сентябрь 28, 2008, 17:13
Именно это и нужно, чтение 5 бит

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


Название: Re: Прием данных из COM порта в коде МТК
Отправлено: VAP от Сентябрь 28, 2008, 17:26
Спасибо Pastor за хороший совет, обязательно испробую, в домашних условиях невозможно проверить.

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


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