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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Qt и плата te1-pci2  (Прочитано 2123 раз)
Naska_igorevna
Новичок

Offline Offline

Сообщений: 2


Просмотр профиля
« : Март 31, 2022, 19:04 »

Здравствуйте, есть двухканальная плата te1-pci2 от элкуса, один канал настроен как КК, другой - ОУ. Программа реализует передачу /приём массива данных из одного канала в другой. При условии, когда массив до 32 элементов работа программы корректна, если длина массива больше, приём некорректный, насчитывается именно 33 элемент, а в конце добавляется ноль. Подскажите, пожалуйста, в чем может быть причина. Заранее спасибо. И извините, если ошиблась веткой форума.

Код:
const short SZ = 32,
    Base = 1,
    rtAddr = 0x1B, /*27*/
    rtSubAddr = 0x1E;    /*30*/
int back[64],
    OutputMas[64], //awBuf
    InputMas[64]; //bcBack

int KS, OS, i, tmbNum, ErrorInt;
QString OutputStr, // строка для принятия сообщения
        InputStr, // строка для отправки сообщения
        MilName; // имя манчестера
TTmkEventData tmkEvD;
TTmkConfigData tmkCfg;
QByteArray str;

int Mysize = 2 * SZ;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    if (TmkOpen())
    { ui->StatusLB->addItem("Манчестер НЕ готов к работе"); }
    else { ui->StatusLB->addItem("Манчестер готов к работе"); }
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked() //отправить
{
    InputStr = ui->MessageLine->text();

    for (i = 0; i < InputStr.size(); i++)
    {
        InputMas[i] = InputStr[i].digitValue();
    }

    for (register int i = 0; i < Mysize; i++)
    {
        back[i] = OutputMas[i] = 0;
    }


    if(ui->radioButton->isChecked())
    {
        //Подготовить устройство 0 в режиме КК
        if(tmkconfig(0) != 0)
        {
            ui->StatusLB->addItem("tmkconfig() выполнить не удалось! Плата занята или отсутствует\n");
            TmkClose();
        }
        tmkselect(0);
        tmkgetinfo(&tmkCfg);

        ui ->StatusLB->addItem("Имя платы: " + QString::fromLatin1(tmkCfg.szName));
        bcreset();
        bcdefbase(Base); // Функция настраивает выбранный КК и драйвер на дальнейшую работу с ДОЗУ в указанной базе.

        // Подготовить плату 1 в режиме ОУ.
        if (tmkconfig(1))
        {
            ui->StatusLB->addItem("Ошибка конфигурации mil-1553\n");
        }
        rtreset(); //Функция производит инициализацию выбранного устройства с переводом его в режим ОУ.
        rtdefaddress(rtAddr);

        #if USE_MODE==YES
        int rtMode = rtgetmode();
        if (rtdefmode(rtMode
        #if FLAG_MODE==YES
            | RT_FLAG_MODE
        #endif
            | RT_HBIT_MODE)) std::cout << "\nThere is an error with rtdefmode.\n";
        rtMode = rtgetmode();
        #endif

        rtdefsubaddr(RT_TRANSMIT, rtSubAddr);
        rtclrflag();
        rtdefsubaddr(RT_RECEIVE, rtSubAddr);
        rtclrflag();

        //{-> Подготовка сообщения.
        tmkselect(0);
        KS = CW(rtAddr, RT_RECEIVE, rtSubAddr, InputStr.size());
        bcputw(0, KS);

        for (i = 0; i<InputStr.size(); i++) bcputw(i + 1, InputMas[i]); delay(2);

        //{-> Отправка сообщения.

        bcstartx(Base, DATA_BC_RT | CX_CONT | CX_BUS_A | CX_NOSIG); // CX_BUS_A - канал 1
        delay(2);
        if (ErrorInt != 0) { bcstartx(Base, DATA_BC_RT | CX_CONT | CX_BUS_B | CX_NOSIG); } // то переходим на резервный канал CX_BUS_A

        tmkgetevd(&tmkEvD);
        //<-}

        ui->StatusLB->addItem("Успешно отправлено: " + InputStr);
    }
}


void MainWindow::on_pushButton_2_clicked() // считать
{
    if(ui->radioButton->isChecked())
    {
        tmkselect(1);

        for (i = 0; i < InputStr.size(); i++) { back[i] = rtgetw(i); delay(2); }
        std::cout<< ""<<std::endl;
        for (i = 0; i < Mysize; i++) {  std::cout<<  back[i]<<std::endl;} // до сюда вроде норм

        rtdefsubaddr(RT_TRANSMIT, rtSubAddr);
        std::cout<<  "" <<std::endl;

        for (i = 0; i < InputStr.size(); i++) rtputw(i, back[i]); delay(2); //Функция записывает слово back[i] в текущий подадрес ДОЗУ выбранного ОУ по адресу i.

        //{-> Запрос подготовленного сообщения из ОУ
        tmkselect(0);
        KS = CW(rtAddr, RT_TRANSMIT, rtSubAddr, InputStr.size());delay(2);
        bcputw(0, KS); delay(2);

        bcstartx(Base, DATA_RT_BC | CX_STOP | CX_BUS_A | CX_NOSIG); delay(2);
    //   if ()
        //<-}

        for (i = 0; i < InputStr.size(); i++) { OutputMas[i] = bcgetw(i + 2); delay(2); std::cout<<  OutputMas[i]<<std::endl; }


        if (OutputMas == NULL) { ui->StatusLB->addItem("Данные НЕ были считаны с платы!"); }

        else { for (i = 0; i < InputStr.size(); i++) { OutputStr += QString::number(OutputMas[i]);  } } //считывает правильно с платы, но выводит неправильно

        // Вывод результата на экран
        ui->StatusLB->addItem("Принято: " + OutputStr + " - успешно!");

        if (QString::compare(InputStr,OutputStr) != 0)
        {
            ui->StatusLB->addItem("Данные считаны НЕ верно: " + InputStr + " != " + OutputStr  + " : ОШИБКА!");
        }
        else
        {
            ui->StatusLB->addItem("Данные считаны верно! " + InputStr + " = " + OutputStr + " : УСПЕШНО!");
        }
        rtreset();
        TmkClose();
        if (TmkOpen()) { ui->StatusLB->addItem("Манчестер не завершил работу!"); }
        ui->StatusLB->addItem("Манчестер завершил работу!");
    }
}
Записан
qtkoder777
Частый гость
***
Offline Offline

Сообщений: 245


Просмотр профиля
« Ответ #1 : Март 31, 2022, 23:41 »

Подскажите, пожалуйста, в чем может быть причина. Заранее спасибо. И извините, если ошиблась веткой форума.
Код:
for (i = 0; i < InputStr.size(); i++) rtputw(i, back[i]); delay(2); 
//Функция записывает слово back[i]
//в текущий подадрес ДОЗУ
Превысили ДОЗУ! Плата пьянеет и начинает глючить.
Записан
Dimas
Чайник
*
Offline Offline

Сообщений: 50



Просмотр профиля
« Ответ #2 : Апрель 01, 2022, 08:29 »

Если это про манчестер, то посмотрите внимательно спецификацию. Размер одного пакета 32 слова. Для передачи следующих слов надо укладывать их на следующий подадрес.
ГОСТ Р 52070-2003 Интерфейс магистральный: https://ohranatruda.ru/upload/iblock/5ee/4294816610.pdf
« Последнее редактирование: Апрель 01, 2022, 08:40 от Dimas » Записан

qt 4.8.6, qt 5.12.4
Naska_igorevna
Новичок

Offline Offline

Сообщений: 2


Просмотр профиля
« Ответ #3 : Апрель 01, 2022, 10:14 »

Спасибо большое, разобралась Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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