Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Зависание программы при отключении com-порта


Автор: Курсант 7.9.2015, 09:23
Всем доброго времени суток!

У меня странная проблема - при деактивации компонента 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;
    }
}


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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)