Здравствуйте, есть двухканальная плата 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("Манчестер завершил работу!");
}
}