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