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

C# SetialPort种读取串口数据时使用委托出错

2013-03-14 
C# SetialPort类读取串口数据时使用委托出错。public void Sp_DataReceived(object sender, System.IO.Port

C# SetialPort类读取串口数据时使用委托出错。

public void Sp_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            string strTemp = "";
            double iSecond = 0.5;

            DateTime dtOld = System.DateTime.Now;
            DateTime dtNow = System.DateTime.Now;
            TimeSpan dtInter;
            dtInter = dtNow - dtOld;

            int i = Sp.BytesToRead;
            if (i > 0)
            {
                try
                {
                    strTemp = Sp.ReadExisting();
                }
                catch
                { }
                if (strTemp.ToLower().IndexOf("\r") < 0)
                {
                    i = 0;
                }
                else
                {
                    this.Invoke(interfaceUpdataHandle, strTemp);
                }
            }
            while (dtInter.TotalSeconds < iSecond && i <= 0)
            {
                dtNow = System.DateTime.Now;
                dtInter = dtNow - dtOld;
                i = Sp.BytesToRead;
                if (i > 0)
                {
                    try
                    {


                        strTemp += Sp.ReadExisting();
                    }
                    catch
                    { }
                    if (strTemp.ToLower().IndexOf("\r") < 0)
                    {
                        i = 0;
                    }
                    else
                    {
                        this.Invoke(interfaceUpdataHandle, strTemp);
                    }
                }
            }
            // do null  

        }


private SerialPort Sp = new SerialPort();
Sp.PortName = this.comboBox2.Text.Trim();
                Sp.BaudRate = Convert.ToInt32(this.comboBox1.Text.Trim());
                Sp.Parity = Parity.None;
                Sp.StopBits = StopBits.One;
                Sp.DataReceived += new SerialDataReceivedEventHandler(Sp_DataReceived);



以上是我使用SerialPort类去读取串口数据的部分代码,我用了SerialDataReceivedEventHandler(Sp_DataReceived)去调用函数Sp_DataReceived去读取数据。可程序执行到Sp.DataReceived += new SerialDataReceivedEventHandler(Sp_DataReceived)时,程序没有进入函数Sp_DataReceived。请问这是为什么呢??急急急急...........

[解决办法]
串口收到数据,
然后是收到数据弹出窗口。
上面的语法要跨线程,并且又有datareceived事件。由于datareceived事件触发的条件有点点复杂,需要弄懂,再跨线程调用窗体语法很复杂。
就把程序分拆开,先用较简单的方法确认有没有收到数据。再收到数据后显示窗体。
功能完成以后再用这样的“精简”的代码。
加个定时器,然后定时用sp.readexist()读串口数据。
如果有数据了看看收到的数据对不对。
然后再改为用datareceived收数据。
另外datareceived手数据好像要用Thread.Sleep()来延时,以确保把数据收完。

[解决办法]
 如果你实验的时候是com1接com2,一个用串口精灵发,一个用你的程序收,记得要用交叉线,用直连线是肯定收不到的(串口线有两种)
你先用串口精灵看看能不能收到数据,未必是程序的问题。
[解决办法]
一般串口收发数据就用一个串口头,把收发的两个引脚(2脚和3脚)短接就行了。这样发的时候串口也收到数据了。
------解决方案--------------------


既然电子秤使用的是COM3 你打开COM1和COM2去测试 肯定收不到数据啊
这种电子秤应该是采用的USB模拟串口技术 COM3就是他虚拟出来的串口 你把你的sp指向COM3然后在打开试试
[解决办法]

引用:
引用:引用:引用:一般串口收发数据就用一个串口头,把收发的两个引脚(2脚和3脚)短接就行了。这样发的时候串口也收到数据了。这个用程序如何实现呢?对这个不了解耶!

你该不会连线都没接吧。。。那数据要怎么传输啊,通过空气咩
当然是要交叉啦,将COM1的……


= =我说的是你用串口精灵测试的时候采用这种接线方法。。。先检测下你的程序能不能用
USB的我没做过

热点排行