To:yefanqiu
我在您的blog中看到 串口操作实用类 这篇文章.不知道该如何使用获取到串口返回信息.类详见:http://topic.csdn.net/u/20071211/16/a6cafd0c-ab2f-4960-9abd-41923b360d98.html我写了一个串口控制类,也就是向串口发送信息,但不知道该如何去获取返回信息
...
 PortData port = new PortData("COM1", 9600);
 //向串口发送数据
 public void selectKey(byte TMKAddress, byte workKeyAddress)
        {
            byte[] reg = new byte[8];
            byte[] setData = new byte[6];
            setData[0] = 0x1B;
            setData[1] = 0x41;
            setData[2] = TMKAddress;
            setData[3] = workKeyAddress;
            setData[4] = 0x0D;
            setData[5] = 0x0A;
            if (!port.IsOpen())
            {
                port.Open();
                int i = port.SendCommand(setData, ref reg, 1000); //1000这个参数作用不是太明白
                if (i != -1) 
                {
                    byteReg= pdr.Data;
                }                port.Close();
            }        private byte[] _byteReg;
        public byte[] byteReg
        {
            get { return _byteReg; }
            set { _byteReg = value; }
        }        private string _strReg;
        public string strReg
        {
            get { return _strReg; }
            set { _strReg = value; }
        }...
1.事件委托我不是很清楚.这样写肯定有问题.
2.总是接收不到串口数据,如果一步步跟踪调试的话可以捕获到.串口返回时间问题吗?如果问题解决,200分送上!
不胜感激!

解决方案 »

  1.   

    没在本版见过叶帆,而且好像他很久不来CSDN了~
      

  2.   

    定义一个函数:
    private void ReceiveData(object sender, PortDataReciveEventArgs e)
    {
        // 在这里处理接收数据
    }上面加上:
    ......
    PortData port = new PortData("COM1", 9600);
    port.Received = new(PortDataReceivedEventHandle(ReceiveData));
      

  3.   

    哦,port.Received = new(PortDataReceivedEventHandle(ReceiveData));应该写到你的初始化函数里面,而且应该写成:
    port.Received += new(PortDataReceivedEventHandle(ReceiveData));
      

  4.   

    TO:khler 
    port.Received   =   new(PortDataReceivedEventHandle(ReceiveData));这样写是错误的port.Received += new PortDataReceivedEventHandle(port_Received);void port_Received(object sender, PortDataReciveEventArgs e)
            {            Console.WriteLine("1111111111111111111111111");
                Console.WriteLine(Convert.ToString(pdr.Data));
                //throw new Exception("The method or operation is not implemented.");
            }我试过了.但每次都打印不出来
      

  5.   

    那是因为PortData类引起的,因为他在发送数据时关掉了接收数据事件,不知道PortData类设计者为何这么做,这明显会丢失数据的
    不知道LZ是否考虑过放弃使用PortData类?因为这个类并没有比直接使用SerialPort类带来更多方便
      

  6.   

    我现在想实现的就是从串口获取数据.通过一个方法能够时时捕获到串口发出的数据
    就好像SerialPort的DataReceived那样的效果.
    封装起来形成一个Dll以供使用.
      

  7.   

    C#中串口通信编程
    ivanx 著于2007-8-15 17:22:20
    本文将介绍如何在.NET平台下使用C#创建串口通信程序,.NET 2.0提供了串口通信的功能,其命名空间是System.IO.Ports。我们将使用标准的RS 232C在PC间通信...看看,有用否?
      

  8.   

    谢谢楼上的.那个我做过类似的例子.看来我还是继承SerialPort类操作好了
      

  9.   

    哦,那就改改SendCommand()函数:
    //发送命令
            public int SendCommand(byte[] SendData, ref  byte[] ReceiveData,int Overtime)
            {            if(port.IsOpen)
                {
                    。
                    。
                    。
                    。                ReceiveEventFlag = false;       //打开事件
                    if (port.BytesToRead >= ReceiveData.Length) 
                        ret = port.Read(ReceiveData, 0, ReceiveData.Length);
                    return ret;
                }
                return -1;
            }
    就是把ReceiveEventFlag = false;跟if()语句调换一下位置;
    另外,~PortData()虚构函数是没用的,必须显示调用Close()函数关闭端口(),因为你不知道port对象什么时候被销毁,它是受垃圾回收器管理的,所以不知道什么时候会调用~PortData()
      

  10.   

    我试过了.可还是接收不到数据.是不是哪里写错了?
    port.Received += new PortDataReceivedEventHandle(port_Received);void port_Received(object sender, PortDataReciveEventArgs e)
            {            Console.WriteLine("1111111111111111111111111");
                            //throw new Exception("The method or operation is not implemented.");
            }public void selectKey(byte TMKAddress, byte workKeyAddress)
            {
                byte[] reg = new byte[8];
                byte[] setData = new byte[6];
                setData[0] = 0x1B;
                setData[1] = 0x41;
                setData[2] = TMKAddress;
                setData[3] = workKeyAddress;
                setData[4] = 0x0D;
                setData[5] = 0x0A;
                if (!port.IsOpen())
                {
                    port.Open();
                    int i = port.SendCommand(setData, ref reg, 1000); //1000这个参数作用不是太明白
                    if (i != -1) 
                    {
                        byteReg= pdr.Data; // 声明PortDataReciveEventArgs pdr = new PortDataReciveEventArgs();
                    }                port.Close();
                }
    }        private byte[] _byteReg;
            public byte[] byteReg
            {
                get { return _byteReg; }
                set { _byteReg = value; }
            }获取不到返回值 pdr.Data为null
      

  11.   

    或者也可能是你的SendCommand(setData, ref reg, 1000)第三个参数的问题,你的那个while循环是循环壹千次,而不是等待1000毫秒,循环壹千次时间是很短的
      

  12.   

    楼主是在模拟器上调试吗?如果是,SerialPoint 确实有这个问题,因为模拟器的串口默认有 UART 的功能,不但接收不到,发送时还会阻塞。
      

  13.   

    计时:
    long start = System.DateTime.Now.Ticks;
    long end = System.DateTime.Now.Ticks;
    while( end - start < 1000 )
    {
        ..........
        end = System.DateTime.Now.Ticks;
    }
      

  14.   

    1、由于该段代码我是用在wince系统上的,由于wince一般最小时间刻度为秒,没有办法精确到毫秒,所以采用了循环和sleep相结合的延时方式。如上位机使用可以如楼上的方式延时(最好循环体内加Application.DoEvents())。2、SendCommand 命令主要针对主从方式的串口通信,也就是说,我PC向设备发一指令,正常情况是在超时时间内应该响应我的命令,并向PC返回数据。如果没有返回,有两种原因,一是、超时时间过短,二是、设备根本没有返回。3、该类在我一个医疗项目上使用,代码本身应该没有什么问题。
      

  15.   

    WinCE上的代码,在开发板上调试通过:private void OpenPort()
    {
        if (_serialPort == null)
        {
            try
            {
                _serialPort = new SerialPort(cmbPort.Text, int.Parse(cmbBaudrate.Text));
                _serialPort.Open();
                _serialPort.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(_serialPort_DataReceived);
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }  
    }
    void _serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
        byte[] buffer = new byte[_serialPort.BytesToRead];
        int rc = _serialPort.Read(buffer, 0, buffer.Length);
        ProcessMessage(buffer, rc);
    }
      

  16.   

    在.net2005上有SerialPort串口类,你使用它吧行吗?它有对应接收数据的事件