首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试在UI-Thread中设置变量

尝试在UI-Thread中设置变量
EN

Stack Overflow用户
提问于 2014-09-30 13:44:21
回答 3查看 101关注 0票数 0

我使用这段代码从加权标度读取,我成功地从它读取权重值,但是当尝试为下一个权重值设置变量hex = ""时,我无法在文本框中获得它,它会很快出现,然后再次消失,如果我按照预期的方式跟踪带有十六进制=“启用”结果的程序,但是如果运行程序而不跟踪它,那么闪烁的值和文本框就会变为空:(任何想法都可以)

代码语言:javascript
复制
        string hex = "";
        private delegate void Closure();
        private void SerialPortOnDataReceived(object sender, SerialDataReceivedEventArgs serialDataReceivedEventArgs)
        {
            if (InvokeRequired)     
            {                
                BeginInvoke(new Closure(() => { SerialPortOnDataReceived(sender, serialDataReceivedEventArgs); }));     
            }
            else
            {
                if (_serialPort.BytesToRead > 0)
                {
                    //hex = "";  <- Without this different weight values appears one after another. If applied then happens what explained above.
                    while (_serialPort.BytesToRead > 0) //<-- repeats until the In-Buffer is empty
                    {                        
                        hex += string.Format("{0:X2} ", _serialPort.ReadByte());                        
                    }

                    byte[] data = FromHex(hex.Trim());
                    textBox1.Text = Encoding.ASCII.GetString(data).Trim();
                }
            }
        }

        public byte[] FromHex(string aHex)
        {
            aHex = aHex.Replace(" ", "");
            byte[] raw = new byte[aHex.Length / 2];
            for (int i = 0; i < raw.Length; i++)
            {
                raw[i] = Convert.ToByte(aHex.Substring(i * 2, 2), 16);
            }
            return raw;
        }

下面是开始监听的代码:

代码语言:javascript
复制
        private void button1_Click(object sender, EventArgs e)
        {
            //<-- This block ensures that no exceptions happen
            if (_serialPort != null && _serialPort.IsOpen)
                _serialPort.Close();
            if (_serialPort != null)
                _serialPort.Dispose();
            //<-- End of Block


            /*--- OHAUS Ranger Count Config ---*/
            //http://us.ohaus.com/us/en/home/support/faq.aspx
            _serialPort = new SerialPort(comboBox1.Text);
            _serialPort.BaudRate = 2400;
            _serialPort.Parity = Parity.None;
            _serialPort.DataBits = 7;
            _serialPort.StopBits = StopBits.Two;
            _serialPort.Handshake = Handshake.None;
            /*--- End OHAUS Ranger Count Config ---*/

            label1.Text = "Listening on " + _serialPort.PortName + "...";

            _serialPort.DataReceived += SerialPortOnDataReceived;       //<- Here I add the event
            _serialPort.Open();     //<-- make the comport listen

        }

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-09-30 15:32:05

这是对我有用的,我在hex = ""之前添加了一些延迟,但是我认为这不是一个好的实践:

代码语言:javascript
复制
        string hex = "";
        private delegate void Closure();        
        private void SerialPortOnDataReceived(object sender, SerialDataReceivedEventArgs serialDataReceivedEventArgs)
        {
            if (InvokeRequired)     
            {                
                BeginInvoke(new Closure(() => { SerialPortOnDataReceived(sender, serialDataReceivedEventArgs); }));                
            }
            else
            {
                if (_serialPort.BytesToRead > 0)
                {                    
                    Thread.Sleep(200);  //<-- Add some delay
                    hex = "";

                    while (_serialPort.BytesToRead > 0) //<-- repeats until the In-Buffer is empty
                    {                        
                        hex += string.Format("{0:X2} ", _serialPort.ReadByte());                        
                    }

                    byte[] data = FromHex(hex.Trim());                    
                    textBox1.Text = Encoding.ASCII.GetString(data).Trim();                    
                }
            }
        }
票数 0
EN

Stack Overflow用户

发布于 2014-09-30 14:11:25

在按下打印键时调用的方法中,可以添加串行端口事件处理程序:

代码语言:javascript
复制
_serialPort.OnDataReceived+=SerialPortOnDataReceived;

然后,在SerialPortOnDataReceived方法的末尾(成功读取之后),从串行端口对象中删除事件处理程序。这将使它停止监听串口上的新数据,直到您再次按下print。

代码语言:javascript
复制
private void SerialPortOnDataReceived(object sender, SerialDataReceivedEventArgs serialDataReceivedEventArgs)
{
    if (InvokeRequired)     
    {                
        BeginInvoke(new Closure(() => { SerialPortOnDataReceived(sender, serialDataReceivedEventArgs); }));     
    }
    else
    {
        if (_serialPort.BytesToRead > 0)
        {
            //hex = "";  <- Without this different weight values appears one after another. If applied then happens what explained above.
            while (_serialPort.BytesToRead > 0) //<-- repeats until the In-Buffer is empty
            {                        
                hex += string.Format("{0:X2} ", _serialPort.ReadByte());                        
            }

            byte[] data = FromHex(hex.Trim());
            textBox1.Text = Encoding.ASCII.GetString(data).Trim();
            _serialPort.OnDataReceived-=SerialPortOnDataReceived; // <---add this
        }
    }
}
票数 1
EN

Stack Overflow用户

发布于 2014-09-30 15:07:13

我就是这样更新UI线程的。

代码语言:javascript
复制
    delegate void SerialPortOnDataReceivedDelegate(object sender, SerialDataReceivedEventArgs serialDataReceivedEventArgs);
    private void SerialPortOnDataReceived(object sender, SerialDataReceivedEventArgs serialDataReceivedEventArgs)
    {
        if (InvokeRequired)
            BeginInvoke(new SerialPortOnDataReceivedDelegate(SerialPortOnDataReceived), new object[] { sender, serialDataReceivedEventArgs });
        else
        {
            if (_serialPort.BytesToRead > 0)
            {
                //hex = "";  <- Without this different weight values appears one after another. If applied then happens what explained above.
                while (_serialPort.BytesToRead > 0) //<-- repeats until the In-Buffer is empty
                {                        
                    hex += string.Format("{0:X2} ", _serialPort.ReadByte());                        
                }

                byte[] data = FromHex(hex.Trim());
                textBox1.Text = Encoding.ASCII.GetString(data).Trim();
            }
        }
    }
    public byte[] FromHex(string aHex)
    {
        aHex = aHex.Replace(" ", "");
        byte[] raw = new byte[aHex.Length / 2];
        for (int i = 0; i < raw.Length; i++)
        {
            raw[i] = Convert.ToByte(aHex.Substring(i * 2, 2), 16);
        }
        return raw;
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26122439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档