本人正在用c#做一个与三菱PLC通讯的程序,用SerialPort类的DataReceived的事件接收的数据都分成几段。请问如何一次接收所有的数据。

解决方案 »

  1.   

    关注。
    楼主的通信是怎么写的啊?是用Modbus吗?
    学习。。
      

  2.   

    用用SerialPort类的DataReceived的事件,请看清楚。
      

  3.   

    这个与你设置的接收长度有关吧
    你可以判断一下子,如果收到了PLC的结束字符,你就处理一下,没有到就继续往里面加.
    我是先把PLC发送给上位机的东西保存到一个bit数组中,然后赋给stringbuilder
      

  4.   

    http://blog.csdn.net/JustLovePro/archive/2008/12/15/3523348.aspx
      

  5.   

    我现在使用的是6楼withcsharp的方法,时间设定在0.15秒,但始终让人不放心。
    我用的是FX3U,接收的数据中,倒数第三位是03,最后两位是和校验代码。
      

  6.   

        代码大致如下,希望大家有更好的建议          private StringBuilder sb_Receive = new StringBuilder();
          
           //定时发送数据 每1500ms发送一次。dsSendPool是dataset,储存发送数据。用LoadDefaut()从XML读取数据到DATASET
            private void timersend_Tick(object sender, EventArgs e)
            {
                dsSendPool.Tables[0].Clear();            //LoadDefaut()从XML读取数据到DATASET
                LoadDefaut();            int PoolRows;
                PoolRows = dsSendPool.Tables[0].Rows.Count;            //SendData()为发送数据
                SendData(dsSendPool.Tables[0].Rows[i_rows]["SendData"].ToString());
                
                i_rows++;            if (i_rows == PoolRows)
                {
                    i_rows = 0;
                }            //延迟150毫秒
                 timer_Receive.Interval = 150;
                timer_Receive.Enabled = true;
            }
            //发送后0.15秒接收
            private void timer_Receive_Tick(object sender, EventArgs e)
            {
                //处理sb_Receive.ToString()数据              //清空sb_Receive
                timer_Receive.Enabled = false;
                int length = sb_Receive.Length;
                sb_Receive.Remove(0, length);
            }        /// <summary>
            /// 发送数据到串口
            /// </summary>
            private void SendData(string SendText)
            {
                if (ComPort.IsOpen)
                {
                    try
                    {
                        // 转换用户十六进制数据到字节数组
                        byte[] data = HexStringToByteArray(SendText);                    // 发送数据到串口
                        ComPort.Write(data, 0, data.Length);
                    }
                    catch (FormatException)
                    {
                        //错误处理
                    }
                }
            }
             //接收数据
            /// <summary>
            /// 接收数据
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {            
                // 获取字节长度
                int bytes = ComPort.BytesToRead;            // 创建字节数组
                byte[] buffer = new byte[bytes];            // 读取缓冲区的数据到数组
                ComPort.Read(buffer, 0, bytes);            //整理接收数据
                sb_Receive.Append(ByteArrayToHexString(buffer));        }        //十六进制转换字节数组
            /// <summary>
            /// 十六进制转换字节数组
            /// </summary>
            /// <param name="s"></param>
            /// <returns></returns>
            private byte[] HexStringToByteArray(string s)
            {
                s = s.Replace(" ", "");
                byte[] buffer = new byte[s.Length / 2];
                for (int i = 0; i < s.Length; i += 2)
                    buffer[i / 2] = (byte)Convert.ToByte(s.Substring(i, 2), 16);
                return buffer;
            }