地磅参数: 
波特率:300/600/900/1200/2400/4800可选
数据位:ASII码,第一位起始位,中间8位数据位,最后一位停止位。每组10位
串行通讯的连续发送:每帧数据共有8组组成。数据传送先低位后高位。每组数据间有分隔符=.如当前毛重是70.15连续发送51.0700=51.0700=.....
我用下面的代码操作,却读不到任何数据。
string returnStr = "";
SerialPort myComPort;
using (myComPort = new SerialPort("com1"))
{
   myComPort.BaudRate = 4800;
   myComPort.DataBits = 8;
   myComPort.StopBits = StopBits.One;
   myComPort.Parity = Parity.None;
   myComPort.ReadTimeout = 1000;
   myComPort.Open();
   try
   {
       //数据读取
       string str = myComPort.ReadLine();
       //截取字符串
       char[] arrayone = str.Trim().Substring(1, 5).ToCharArray();
       //字符串反转
       char[] array = new char[5];
       for (int i = 0; i < 5; i++)
       {
           array[i] = array[4 - i];
       }
       returnStr = array.ToString();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }                    
    txtweight.Text = returnStr;
}  
请各位大虾帮助。

解决方案 »

  1.   

    给你一个代码示例吧。这是我的串口程序中所使用的部分代码,一定要注意BaudRate,如果设错了是收不到数据的。internal class CommPort
    {
        protected SerialPort commPort = new SerialPort();
        private readonly int int_Loc = 0;    private readonly StringBuilder strReceive = new StringBuilder();     // 接收到数据的缓冲区    #region CommPort 构造函数    /// <summary>
        /// CommPort 构造函数
        /// </summary>
        public CommPort()
        {
            // 初始化串口 
            commPort.BaudRate = 1200;
            commPort.Parity = Parity.Even;
            commPort.Encoding = Encoding.UTF8;        // 串口的数据接收事件
            commPort.DataReceived += commPort_DataReceived;
        }    #endregion    #region commPort_DataReceived 数据抵达    /// <summary>
        /// commPort_DataReceived 数据抵达
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void commPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
                Base.int_Cmd_States[int_Loc] = (Base.int_Cmd_States[int_Loc] / 20) * 20 + 1;            #region 接收数据            // 接收缓冲区中数据的字节数
                int int_Len = commPort.BytesToRead;            // 接收数据
                byte[] bytes = new byte[int_Len];
                commPort.Read(bytes, 0, int_Len);            #endregion            #region 将数据存入缓冲            // 将数据存入字符串缓冲区中
                for (int i = 0; i < bytes.Length; i++)
                {
                    strReceive.Append(bytes[i] + " ");
                }            #endregion        }
            catch (Exception ex)
            {
                frmMain.WriteSysMsg(ex.StackTrace, "[CommPort] 数据接收不成功.", ex.Message);
            }
        }    #endregion    #region List 获取串口的列表    /// <summary>
        /// List 获取串口的列表
        /// </summary>
        /// <returns></returns>
        public static ArrayList List()
        {
            try
            {
                ArrayList al = new ArrayList();            ManagementClass mc = new ManagementClass("Win32_SerialPort");
                ManagementObjectCollection moc = mc.GetInstances();            foreach (ManagementObject mo in moc)
                {
                    al.Add(mo["DeviceID"].ToString());
                }            return al;
            }
            catch (Exception ex)
            {
                MessageBox.Show("程序发生错误 \n\n错误描述: [严重错误]\n" +
                                "列出计算机上所有串口时出错. " + "\n\n 错误原因: \n" + ex.StackTrace + "\n\n错误反馈: \n" + ex.Message);
                return null;
            }
        }    #endregion    #region IsOpen 测试串口是否已经打开    /// <summary>
        /// 测试串口是否已经打开
        /// </summary>
        /// <returns></returns>
        public bool IsOpen()
        {
            try
            {
                if (commPort == null) return false;            return commPort.IsOpen;
            }
            catch (Exception ex)
            {
            }        return false;
        }    #endregion    #region Open 打开串口    /// <summary>
        /// 打开串口
        /// </summary>
        /// <returns></returns>
        public bool Open()
        {
            try
            {
                if (!commPort.IsOpen)
                {
                    commPort.Open();
                }            return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }    #endregion    #region Close 关闭串口    /// <summary>
        /// 关闭串口
        /// </summary>
        /// <returns></returns>
        public bool Close()
        {
            try
            {
                if (commPort.IsOpen)
                {
                    commPort.Close();
                }            return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }    #endregion    #region Write 往串口中写数据    /// <summary>
        /// 往串口中写数据
        /// </summary>
        public void Write(byte[] bytes)
        {
            try
            {
                if (commPort.IsOpen)
                {
                    commPort.Write(bytes, 0, bytes.Length);
                }
                else
                {
                    Open();
                    commPort.Write(bytes, 0, bytes.Length);
                }
            }
            catch (Exception ex)
            {
            }
        }    #endregion
    }
      

  2.   

    string str = myComPort.ReadLine();楼主你用这个方法接收数据,你确定接收的都是可见字符么??
    还是用接收byte流吧,不要接收转化字符串
      

  3.   

    我后面改成
    SerialPort myComPort;
    using (myComPort = new SerialPort("com1"))
    {
       myComPort.BaudRate = 9600;
       myComPort.DataBits = 8;
       myComPort.StopBits = StopBits.One;
       myComPort.Parity = Parity.None;
       myComPort.ReadTimeout = 1000;
       myComPort.Open();
       try
       {
          // 接收缓冲区中数据的字节数
          int int_Len = myComPort.BytesToRead;
          MessageBox.Show(int_Len.ToString());
       }
       catch (Exception ex)
       {
          MessageBox.Show(ex.Message);
       }                    
    }
    第一次读出缓冲区中字节数为8,但是后面就每次都为0了,救命啊
      

  4.   

    我现在采用datareceive事件可以接收到数据了,但是我们的二次仪表是连续发送数据的.导致我不方便分析.难道用mscomm控件就可以轻易的解决这个问题吗
      

  5.   

    你可以用我给你提供的那个示例代码调一下,看看 strReceive 最后显示的是什么值。第一次读出缓冲区中字节数为8,但是后面就每次都为0了.本来数据传过来,就是分次传的,在把所有的数据接收完后,来拆分成一条条完整的数据才行。
      

  6.   

    示例改了一下,这次能直接运行了。using System;
    using System.IO.Ports;
    using System.Text;internal class CommPort
    {
        protected SerialPort commPort = new SerialPort();    private readonly StringBuilder strReceive = new StringBuilder();     // 接收到数据的缓冲区    #region CommPort 构造函数    /// <summary>
        /// CommPort 构造函数
        /// </summary>
        public CommPort()
        {
            // 初始化串口 
            commPort.BaudRate = 1200;
            commPort.Parity = Parity.Even;
            commPort.Encoding = Encoding.UTF8;        // 串口的数据接收事件
            commPort.DataReceived += commPort_DataReceived;
        }    #endregion    #region commPort_DataReceived 数据抵达    /// <summary>
        /// commPort_DataReceived 数据抵达
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void commPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
                #region 接收数据            // 接收缓冲区中数据的字节数
                int int_Len = commPort.BytesToRead;            // 接收数据
                byte[] bytes = new byte[int_Len];
                commPort.Read(bytes, 0, int_Len);            #endregion            #region 将数据存入缓冲            // 将数据存入字符串缓冲区中
                for (int i = 0; i < bytes.Length; i++)
                {
                    strReceive.Append(bytes[i] + " ");
                }            #endregion        }
            catch (Exception ex)
            {
                
            }
        }    #endregion    #region IsOpen 测试串口是否已经打开    /// <summary>
        /// 测试串口是否已经打开
        /// </summary>
        /// <returns></returns>
        public bool IsOpen()
        {
            try
            {
                if (commPort == null) return false;            return commPort.IsOpen;
            }
            catch (Exception ex)
            {
            }        return false;
        }    #endregion    #region Open 打开串口    /// <summary>
        /// 打开串口
        /// </summary>
        /// <returns></returns>
        public bool Open()
        {
            try
            {
                if (!commPort.IsOpen)
                {
                    commPort.Open();
                }            return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }    #endregion    #region Close 关闭串口    /// <summary>
        /// 关闭串口
        /// </summary>
        /// <returns></returns>
        public bool Close()
        {
            try
            {
                if (commPort.IsOpen)
                {
                    commPort.Close();
                }            return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }    #endregion    #region Write 往串口中写数据    /// <summary>
        /// 往串口中写数据
        /// </summary>
        public void Write(byte[] bytes)
        {
            try
            {
                if (commPort.IsOpen)
                {
                    commPort.Write(bytes, 0, bytes.Length);
                }
                else
                {
                    Open();
                    commPort.Write(bytes, 0, bytes.Length);
                }
            }
            catch (Exception ex)
            {
            }
        }    #endregion
    }
      

  7.   

    搂主用这个事件就可以了!
     void   commPort_DataReceived(object   sender,   SerialDataReceivedEventArgs   e) 
    { }
      

  8.   

    kao 楼上的方法不错 .