Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Зависание программы при отключении com-порта, Visual C++ и SerialPort 
V
    Опции темы
Курсант
Дата 7.9.2015, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 338
Регистрация: 21.2.2009
Где: Балашиха или Воро неж

Репутация: нет
Всего: 4



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

У меня странная проблема - при деактивации компонента SerialPort в 90% случаев происходит зависание программы. Аналогичная ситуация при закрытии окна программы при активном компоненте SerialPort. При этом при поступлении данных по COM-порту вызывается делегированная функция (извиняюсь если выразился неграмотно). Код примерно такой:

Код

private: System::Void serialPort1_DataReceived(System::Object^  sender, System::IO::Ports::SerialDataReceivedEventArgs^  e) {
             Form1::Invoke(Form1::MyDelegate);
         }


Код

public:
        delegate void AddString();
        AddString^ MyDelegate;

public:
    void AddStringMethod () {
        while ( serialPort1->BytesToRead ) {
            int IntByte;
            static int ByteIndex = 0;
            IntByte = serialPort1->ReadByte ();
            char Byte = IntByte;
            if ( Byte == 58 ) {
                ByteIndex = 0;
            }
            else {
                ByteIndex++;
            }
            DTRequest.Bytes[ByteIndex] = Byte;
            if ( Byte == 13 ) {
                ExecuteDataTransmission ( &DTRequest );
            }
        }
    }


Код

public: void ExecuteDataTransmission ( Data_Transmission_Request_Typedef* pDTRequest)
{
    int ParameterIndex = 0;
    int CellIndex = 0;
    String^ strText;
    if (pDTRequest->StartByte != ':') return;
    switch ( pDTRequest->OpCode ) {
    case READ_VALUE:
        if (radioMeasure1->Checked) { CellIndex = 2; } else if (radioMeasure2->Checked) { CellIndex = 4; }
        ParameterIndex = pDTRequest->ParamCode - READ_VALUE_BASE_INDEX;
        if (MKUParametersTypes[ParameterIndex] == FLOAT_ID ) { strText = Convert::ToString(pDTRequest->Data.AsFloat); }
        else if (MKUParametersTypes[ParameterIndex] == UINT32_ID ) { strText = Convert::ToString(pDTRequest->Data.AsUint32); }
        else if (MKUParametersTypes[ParameterIndex] == INT32_ID ) { strText = Convert::ToString(pDTRequest->Data.AsInt32); }
        if ( ( CellIndex ) && ( ParameterIndex >= 0 ) && (ParameterIndex < dataParameters->RowCount) ) {
            dataParameters->Rows[ParameterIndex]->Cells[CellIndex]->Value = strText;
        }
        break;
    case READ_PRE_VALUE:
        if (radioMeasure1->Checked) { CellIndex = 1; } else if (radioMeasure2->Checked) { CellIndex = 3; }
        ParameterIndex = pDTRequest->ParamCode - READ_PRE_VALUE_BASE_INDEX;
        strText = Convert::ToString(pDTRequest->Data.AsUint32);
        if ( ( CellIndex ) && ( ParameterIndex >= 0 ) && (ParameterIndex < dataParameters->RowCount) ) {
            dataParameters->Rows[ParameterIndex]->Cells[CellIndex]->Value = strText;
        }
        break;
    case READ_K_COEFFICIENT:
        ParameterIndex = pDTRequest->ParamCode - READ_K_COEFFICIENT_BASE_INDEX;
        strText = Convert::ToString(pDTRequest->Data.AsFloat);
        if ( ( ParameterIndex >= 0 ) && (ParameterIndex < dataParameters->RowCount) ) {
            dataParameters->Rows[ParameterIndex]->Cells[K_COEFFICIENT_COLUMN_INDEX]->Value = strText;
        }
        break;
    case READ_B_COEFFICIENT:
        ParameterIndex = pDTRequest->ParamCode - READ_B_COEFFICIENT_BASE_INDEX;
        strText = Convert::ToString(pDTRequest->Data.AsFloat);
        if ( ( ParameterIndex >= 0 ) && (ParameterIndex < dataParameters->RowCount) ) {
            dataParameters->Rows[ParameterIndex]->Cells[B_COEFFICIENT_COLUMN_INDEX]->Value = strText;
        }
        break;
    case READ_SETPOINT_MIN_VALUE:
        ParameterIndex = pDTRequest->ParamCode - READ_SETPOINT_MIN_VALUE_BASE_INDEX;
        strText = Convert::ToString(pDTRequest->Data.AsFloat);
        if ( ( ParameterIndex >= 0 ) && (ParameterIndex < dataSetpoints->RowCount) ) {
            dataSetpoints->Rows[ParameterIndex]->Cells[SETPOINT_MIN_VALUE_COLUMN_INDEX]->Value = strText;
        }
        break;
    case READ_SETPOINT_MAX_VALUE:
        ParameterIndex = pDTRequest->ParamCode - READ_SETPOINT_MAX_VALUE_BASE_INDEX;
        strText = Convert::ToString(pDTRequest->Data.AsFloat);
        if ( ( ParameterIndex >= 0 ) && (ParameterIndex < dataSetpoints->RowCount) ) {
            dataSetpoints->Rows[ParameterIndex]->Cells[SETPOINT_MAX_VALUE_COLUMN_INDEX]->Value = strText;
        }
        break;
    case READ_SETPOINT_DEFAULT_VALUE:
        ParameterIndex = pDTRequest->ParamCode - READ_SETPOINT_DEFAULT_VALUE_BASE_INDEX;
        strText = Convert::ToString(pDTRequest->Data.AsFloat);
        if ( ( ParameterIndex >= 0 ) && (ParameterIndex < dataSetpoints->RowCount) ) {
            dataSetpoints->Rows[ParameterIndex]->Cells[SETPOINT_DEFAULT_VALUE_COLUMN_INDEX]->Value = strText;
        }
        break;
    default: break;
    }
}


Не могу понять причину, по которой происходит зависание. И, соответственно, не могу понять, как с этой причиной бороться.

Это сообщение отредактировал(а) Курсант - 7.9.2015, 09:25
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.1239 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.