首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

从串口读取数据为何显示不出来

2013-06-26 
从串口读取数据为什么显示不出来[解决办法]你也单步走走看看,到底问题出在哪儿。[解决办法]你的串口数据不

从串口读取数据为什么显示不出来
从串口读取数据为何显示不出来
[解决办法]
你也单步走走看看,到底问题出在哪儿。
[解决办法]
你的串口数据不显示,有很多原因,首先确定是否会进你贴出来的委托函数代码。其次查看你的这个串口有多少个和这个串口有关的委托,然后看看是否是限制条件限制了,或者出现异常等。
[解决办法]
我知道你为什么出错了,要先执行串口的DiscardInBuffer()方法,然后在执行串口的Read操作呀。你虽然开始把数据读出来了,但是接着又把数据给抛弃了,你说下面哪会有数据呢?把读取数据那段和清空数据那段掉过来就行了。
[解决办法]
给你参考一下,希望对你有所帮助!
        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
         {
            Thread readThread = new Thread(Read);
            readThread.Priority = ThreadPriority.Highest;
            readThread.Start();
            
        }
        public void Read()
        {
            try
            {
                this.Invoke(new EventHandler(Read1));
            }
            catch { ;}

        }
        public void Read1(Object sender, EventArgs e)
        {
            int iLEN=serialPort1.BytesToRead;
            byte[] b_read = new byte[iLEN];
            serialPort1.Read(b_read, 0, iLEN);
            resultByte.AddRange(b_read);
            serialPort1.DiscardInBuffer();
            if (iLEN > 0)
            {
                if (iLEN == 1 && b_read[0] == '\xE5')
                {
                    serialPort1.DiscardOutBuffer();
                    serialPort1.DiscardInBuffer();
                    serialPort1.Write(PubClass.Byte_con(1), 0, PubClass.Byte_con(1).Length);
                    resultByte.Clear();


                    Thread.Sleep(80);
                }
                else if (resultByte.Count > 20 && resultByte[resultByte.Count - 1] == '\x16')
                {
                    iReadCount++;
                    resultByte.Clear();
                    if (iReadCount < 11)
                    {
                        PubClass.GetLotNum(serialPort1);
                    }
                }
                else
                {
                }
            }

         }

[解决办法]

引用:
Quote: 引用:

串口接收数据的线程与主线程并不是一个线程。。
需要通过委托调用来显示。
委托已写,没贴出来


和你说了,你的代码写的是有问题的

MSDN:从 SerialPort 对象接收数据时,将在辅助线程上引发 DataReceived 事件。由于此事件在辅助线程而非主线程上引发,因此尝试修改主线程中的一些元素(如 UI 元素)时会引发线程异常。如果有必要修改主 Form 或 Control 中的元素,必须使用 Invoke 回发更改请求,这将在正确的线程上执行.进而要想将辅助线程中所读到的数据显示到主线程的Form控件上时,只有通过Invoke方法来实现 

热点排行