解决方案 »

  1.   

    不过还是用C++写串口上位机程序比较好,上面这个资源是以前写的,效果虽然都有了,但是总觉得功能上差了点什么,比如\r\n在串口接收到或者发送前都会无形被替换(好像都变成\r了),数据会发生改变,不过这个源码你可以参考看看
      

  2.   

    C#串口调试助手_VS2010(附源码)
    这个项目,运行报错,打不带
      

  3.   


    你吧代码复制到VS2005中再编译吧,那是我再VS2010下编译的,.net4.0环境
      

  4.   

    C#串口调试助手_VS2005(附源码)
    ----------------------------------我在VS2005 .net2.0重新编译了一下,你自己试试吧
      

  5.   

    感谢海风,程序的基本功能能够实现,能力有限,里面的一些程序还有一些看不懂。想问一些,假如我收到下位机(单片机)发来的数据例如“ff”我就可以在后台调用以ff为名字的这个人信息...也就是我接到一个数据,我就对这个数据进行一些操作,问下这个程序怎么写啊,,,,,
      

  6.   

    现在不知怎么的,调试那个程序时总是说:  string[] strnames = subkey.GetValueNames();这句代码,未处理NullReferenceException,未处理对象引用设置到对象的实例。后来又重新把你那下了一遍,还是运行出现这种情况,这是怎么回事啊,希望你能帮帮忙....
      

  7.   

    这里天刚好写了一个和二次表串口通信的程序,希望能对楼主有帮助首先定义一些全局变量
    SerialPort spReceive = new SerialPort();  //定义一个串口
    string strRecieveSerialPortData = string.Empty;  //用于保存接收到的串口数据
    delegate void HandleInterfaceUpdateDelegate(string text);
    HandleInterfaceUpdateDelegate interfaceUpdateHandle; //用于更新label上的重量数据
    然后初始化串口,可以在窗体加载时调用,也可以在点击按钮时调用,具体配置应该参照实际配置 private void InitClient()
            {
                interfaceUpdateHandle = new HandleInterfaceUpdateDelegate(UpdateLabel);   //委托方法UpdateLabel显示更新过重数据
                spReceive.DataReceived += new SerialDataReceivedEventHandler(spReceive_DataReceived); //当接收到串口数据时触发DataRecieve事件   spReceive.ReceivedBytesThreshold = 8; //缓冲区为8位
       spReceive.DataBits = 8;  //数据位
       spReceive.StopBits = StopBits.One;
       spReceive.PortName = "COM1"; //串口名
        spReceive.ReadTimeout = 2000; //超时时间
       spReceive.BaudRate = 9600; //波特率
       spReceive.Parity = Parity.None;  //校验位
            }
    然后是判断串口是否打开        private void ReadData()
            {
                    if (spReceive.IsOpen)  //如果串口已打开则关闭重新打开
                    {
                        spReceive.Close();
                        spReceive.Open();
                    }
                    else  //如果串口没有打开则打开串口
                    {
                        spReceive.Open();
                    }
            }
    DataReceived事件,从串口读取到数据后触发        void spReceive_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                try
                {
                    string strRecieve = spReceive.ReadExisting();  //获取缓冲区中的数据
                    this.Invoke(interfaceUpdateHandle, new string[] { strRecieve }); //指定interfaceUpdateHandle委托更新并处理数据
                }
                catch (Exception expt)
                {
                    MessageBox.Show(expt.Message); 
                }
            }
    最后是将串口接收到的数据显示到Label上,当然你也可以显示到文本框或其他地方。数据格式处理很麻烦,费了我不少功夫由于每个仪表数据通信协议不同,这里我就不写了。。  private void UpdateLabel(string text)
     {
    //格式处理省略
    if (!string.IsNullOrEmpty(text))
    {
     lbl.Text = text;
    }
    }