Ujjval Shukla Ответов: 1

Как контролировать проблему мерцания в приложении C# windows для отображения данных из последовательного порта?


Всем привет,

Я показываю данные в метке из последовательного порта.Отображение данных в порядке, но метка управления, на которой данные мерцают.Как я могу остановить эту мерцающую проблему, чтобы правильно отображать данные?

Вот мой код-

private void button1_Click(object sender, EventArgs e)
        {
            SerialPort mySerialPort = new SerialPort("COM1");

            mySerialPort.BaudRate = 9600;
            mySerialPort.Parity = Parity.None;
            mySerialPort.StopBits = StopBits.One;
            mySerialPort.DataBits = 8;
            mySerialPort.Handshake = Handshake.None;
            mySerialPort.RtsEnable = true;

            SerialPort sp = (SerialPort)sender;
            label1.Text = sp.ReadExisting();
            mySerialPort.Open();
            mySerialPort.Close();
        }





вот новый код--

public partial class MainForm : Form
    {
        SerialPortManager _spManager;


        
        public MainForm()
        {
            InitializeComponent();
            
            DoubleBuffered = true;
            UserInitialization();
                       
        }


        
        private void UserInitialization()
        {
            _spManager = new SerialPortManager();
            SerialSettings mySerialSettings = _spManager.CurrentSerialSettings;
            serialSettingsBindingSource.DataSource = mySerialSettings;
            portNameComboBox.DataSource = mySerialSettings.PortNameCollection;
            baudRateComboBox.DataSource = mySerialSettings.BaudRateCollection;
            dataBitsComboBox.DataSource = mySerialSettings.DataBitsCollection;
            parityComboBox.DataSource = Enum.GetValues(typeof(System.IO.Ports.Parity));
            stopBitsComboBox.DataSource = Enum.GetValues(typeof(System.IO.Ports.StopBits));

            _spManager.NewSerialDataRecieved += new EventHandler<SerialDataEventArgs>(_spManager_NewSerialDataRecieved);
            this.FormClosing += new FormClosingEventHandler(MainForm_FormClosing);
        }

        
        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            _spManager.Dispose();   
        }

        void _spManager_NewSerialDataRecieved(object sender, SerialDataEventArgs e)
        {
            if (this.InvokeRequired)
            {
                
                this.BeginInvoke(new EventHandler<SerialDataEventArgs>(_spManager_NewSerialDataRecieved), new object[] { sender, e });
                return;
            }

            int maxTextLength = 1000; // maximum text length in text box
            if (tbData.TextLength > maxTextLength)
                tbData.Text = tbData.Text.Remove(0, tbData.TextLength - maxTextLength);

           
            string str = Encoding.ASCII.GetString(e.Data);
            tbData.AppendText(str);
            tbData.ScrollToCaret();
            DoubleBuffered = true;
            label1.Text = str;
            


        }

        
        private void btnStart_Click(object sender, EventArgs e)
        {
            _spManager.StartListening();
        }

        
        private void btnStop_Click(object sender, EventArgs e)
        {
            _spManager.StopListening();
        }
    }







Спасибо

Что я уже пробовал:

Я использовал приведенный ниже код-

охраняемых переопределить CreateParams CreateParams {
получить {
CreateParams cp = base.CreateParams;
cp. ExStyle |= 0x02000000; / / включить WS_EX_COMPOSITED
возврат cp;
}
}

1 Ответов

Рейтинг:
0

OriginalGriff

Попробуйте установить значение DoubleBuffered в true: Контроль.Свойство DoubleBuffered (System.Окна.Формы)[^]- начните с ярлыка, а затем с формы.


Ujjval Shukla

спасибо за ответ OriginalGriff, но проблема та же после использования doubleBuffered....

OriginalGriff

Вы удалили переопределение CreateParams?

Ujjval Shukla

да, я удалил переопределение CreateParams.

OriginalGriff

Начните смотреть, где еще вы влияете на эту метку: код, который вы показываете, находится только при нажатии кнопки и на самом деле не показывает никаких данных (потому что Вы читаете его, прежде чем открыть) - поэтому я бы заподозрил, что данные поступают откуда-то еще, или вы не показываете нам "реальный" код.

Ujjval Shukla

Вот код-
public partial class MainForm: форма
{
SerialPortManager _spManager;



публичная основная форма()
{
метод InitializeComponent();

Свойство управляет = истина;
UserInitialization();

}



частная пустота UserInitialization()
{
_spManager = новый SerialPortManager();
MySerialSettings SerialSettings = _spManager.CurrentSerialSettings;
serialSettingsBindingSource.Источник данных = mySerialSettings;
portNameComboBox.Источник данных = mySerialSettings.PortNameCollection;
бодратекомбобокс.Источник данных = mySerialSettings.BaudRateCollection;
dataBitsComboBox.Источник данных = mySerialSettings.DataBitsCollection;
паритикомбобокс.Источник = Перечисление.GetValues(typeof на(системы.ИО.Портах.Равенство));
stopBitsComboBox.Источник = Перечисление.GetValues(typeof на(системы.ИО.Портах.Стопбиты));

_spManager.NewSerialDataRecieved += новый EventHandler

Ujjval Shukla

_spManager.NewSerialDataRecieved += новый EventHandler

Ujjval Shukla

_spManager_NewSerialDataRecieved недействительным(объект отправителя, SerialDataEventArgs е)
{
если (это.Свойство invokerequired)
{
// Используя это.Invoke вызывает тупик при закрытии последовательного порта, и BeginInvoke в любом случае является хорошей практикой.
этот.BeginInvoke(новый EventHandler

OriginalGriff

Попробуйте вставить его в свой вопрос в виде блока кода - он может быть более читабельным!

Ujjval Shukla

я обновил свой вопрос, пожалуйста, найдите код.

OriginalGriff

Хорошо - во-первых, вам нужно только один раз установить двойную буферизацию для формы, но и установить ее для метки (в конструкторе я бы это сделал).
Во - вторых, он, вероятно, мерцает, потому что обновляется с каждым новым символом или группой символов, но, вероятно, символ, учитывая медленную скорость передачи "стандартных" последовательных данных - 9600 бод составляет всего около 900 символов в секунду, - так что вы почти наверняка получите событие на каждый полученный символ.
Что именно показывает метка по сравнению с текстовым полем?

Ujjval Shukla

этикетка показывает вес предмета, например 0,810.

OriginalGriff

Попробуйте провести эксперимент: помимо записи str в метку, запишите ее также в новую строку файла. Затем внимательно посмотрите на содержимое файла.
Мне было бы интересно посмотреть, как выглядит каждая строка - я подозреваю, что проблема в том, что не каждый str является "полным" номером, поэтому метка кажется мерцающей.

Ujjval Shukla

это выглядит так-
[] 0.030. брекеты соединены я использовал брекеты только для того, чтобы показать символ, который отображается.

OriginalGriff

Заключается в том, что каждая строка в журнале? Все равно?

Ujjval Shukla

да, когда вес меняется, он тоже меняется..

Ujjval Shukla

Метка управления мерцает, когда значение данных становится больше 10.00.ниже 10.00 значений она не мерцает.