日期:2014-05-17  浏览次数:20751 次

关于SerialPort类,串口通信的一个问题
我要实现一个读取IC卡数据的软件,要用到串口通信,我用的类是SerialPort。

问题是:当我用软件给串口发送“读取”指令时,必须要延时,才能收到“返回”的数据(因为读卡器的硬件速度和PC比起来比较慢)。

大致相当于这样的过程

>>>>发送
>>>>sleep
>>>>接收
>>>>sleep
>>>>发送
>>>>sleep
>>>>接收
……

这样做的话造成延时不精确,有时候交互的次数多,延时很大,软件运行比较慢。

我想知道有没有“检测串口有数据到来”的消息或者其他方法,就是当有数据到来之后,我立即进行读取数据,这样就比较快了。

ps:我试了一下 
mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

        public  void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
        {
            receiveData.Initialize();
            mySerialPort.Read(receiveData, 0, receiveLength);
        }

貌似不行,请高手指点一下。

串口通信

------解决方案--------------------
注册这个事件是怎么不行了呢?
有可能数据是分成几次触发该事件,建议改一下保存数据的方式,以免当数据分成两次的时候,后面的数据将之前的覆盖掉
每次收到数据都加放到receiveData里
用mySerialPort.Read(receiveData, 0, receiveLength);只能存储一次的数据
------解决方案--------------------
while (c.flag)
                ;
你想类似CPU啊,都不休息下的,至少要添加Thread.Sleep(1);

另外所有的数据接收处理逻辑都必须写在mySerialPort.DataReceived事件里面,你却写在他处,大错,后面就不看了,这个问题不纠正,你的程序就没法使用。
------解决方案--------------------
http://www.cnblogs.com/jxnclyk/archive/2010/06/07/1753290.html
我经常用的串口都是整一个串口的类,上面是一个例子,建议你下载看看。
关于加sleep()这个,我遇到的有的设备是需要加的,发送过后sleep(N),再去接数据,这个正常
------解决方案--------------------
发送两次导致界面不响应,可能是卡在 while (c.flag);
在第二次发送那打个断点,就在此处c.SendData(sendData, 0, sendData.Length);
等程序运行到此处,继续在Class1内部打断点,打在if (mySerialPort.BytesToRead == receiveLength),这样可以查看发送第二次数据时,串口是否有收到来自IC卡的数据。如果第二次发送数据根本没有收到IC卡回传的数据,那程序会卡在第二次的while(c.flag)
------解决方案--------------------
读卡器端在连续发送给pc机之间最好sleep一下,并且SerialPort,ReceivedBytesThreshold=1设置为1,否则会出现问题的,希望对你有帮助