Thiha Soe Htet -11401642 Ответов: 3

Когда я закрываю serial Comport, моя форма c# висит. Иногда он ничего не может сделать.


Здравствуйте Уважаемый Сэр,
Пожалуйста, помогите мне. Я пишу программу для перехвата данных из последовательного порта . Я могу открыть и поймать данные из этого порта . Но я закрываю последовательный порт , иногда мой порт может быть закрыт , и моя форма висит, ничего не может сделать. Когда я ловлю с точки останова там, и посылаю F10, но он не идет на следующую строку.

общественного недействительными StopPort()
{
пробовать
{
мой порт.Close();// не могу перейти к следующей строке, болтаюсь здесь.
этот.Закрывать();
}
поймать (исключение бывший)
{
этот.Закрывать();
}
}
Спасибо
Тих Све
Мьянма

3 Ответов

Рейтинг:
20

Pikoh

Похоже,что это известная ошибка Компорта, как указано здесь:

Социально-узел MSDN


Они советуют закрыть его в другом потоке,что-то вроде этого:

private void Form1_FormClosing(object sender, FormClosingEventArgs e)

{

if (serialPort1.IsOpen)

{

e.Cancel = true; //cancel the fom closing

Thread CloseDown = new Thread(new ThreadStart(CloseSerialOnExit)); //close port in new thread to avoid hang

CloseDown.Start(); //close port in new thread to avoid hang

}

}

private void CloseSerialOnExit()

{

try

{

serialPort1.Close(); //close the serial port

}

catch (Exception ex)

{

MessageBox.Show(ex.Message); //catch any serial port closing error messages

}

this.Invoke(new EventHandler(NowClose)); //now close back in the main thread

}

private void NowClose(object sender, EventArgs e)

{

this.Close(); //now close the form

}


Рейтинг:
15

0x01AA

Я столкнулся с теми же проблемами. В моем случае удаление обработчиков перед закрытием порта было решением проблемы:

serialPort.ErrorReceived-= ErrorReceived;
serialPort.DataReceived -= SerialDataReceived;
serialPort.Close();


Бруно


Рейтинг:
1

Member 13300889

Public class frmPrincipal

  Public cerrar as boolean = False

    Public Sub New()

      

        AddHandler SPort.DataReceived, AddressOf recibiendo 'AddHandler mira si hay informacion a recibir y luego lo envia el SUB recibiendo
        
    End Sub

 Private Sub recibiendo(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs)
 Try
            If SPort.IsOpen Then

                If cerrar Then
                    Try
                        cerrar = False
                        SPort.Close()

                        Exit Sub
                    Catch 
                    End Try
 Catch 
                    End Try
End Sub

Private Sub btnCerrar_Click(sender As Object, e As EventArgs) Handles btnCerrar.Click
    cerrar = true
End Sub

End class 


Solo tienen que usar una variable booleana que al recibir datos, si la variable se encuentra en True el mismo hilo donde recibe los datos se encargue de cerrar el puerto y listo. Espero que les sirva!!!!

Recuenden проблема-дель-congelamiento Эс-потому что Эль-Пуэрто-серийный Аун ГП найти recibiendo о enviando информации, Соло Дебен controlar в El cierre-дель-Пуэрто-Ан-Эль-дие хило управлением Лос mensajes г готов.