单位要我开发上位机软件 串口通讯 懂的朋友进来帮我下
如题,我以前没有接触过串口编程,得知.NET对串口编程有很好的封装,开始搜索相关资料。
首先 是变频器家电,需要把下位机的参数用桌面winform读出来然后转成各个参数表现给用户。单位是用usb接口的
经过一个星期接触,我所了解的知识有以下几点
  1. using System.IO.Ports; 命名空间下
     SerialPort 串口; //SerialPort类 声明对象
     串口= new SerialPort(串口名(), 波特率(), 奇偶性(), 数据位(), 停止位());//用五个方法返值作为五个参数
  2. 串口.DataReceived += new SerialDataReceivedEventHandler(串口_DataReceived);//添加接收数据事件
  3. private delegate void 委托();//听说用委托来接收数据
      private void 接收数据()
         {
             string 数据 =string.Empty;
             数据 = 串口.ReadExisting();//难道这句就是从串口读取下位机参数的函数吗?
             this.listBox1.Items.Add(数据);
         }
         private void 委托方法()
         {
             this.Invoke(new 委托(接收数据));
         }
       //以上两个方法是网上搜到的资料 不知对否
  4. private void 串口_DataReceived(object sender, SerialDataReceivedEventArgs e)
         {
             Thread 线程 = new Thread(委托方法);//网上资料说 用一个线程来装这个委托方法 接收数据  
         }      
  难道就这么简单吗? 网上看了很多资料 不是断章取义 就是互相抄袭  
   有说这样写的
   int bytes = serialPort1.BytesToRead;
             byte[] buffer = new byte[bytes];
             if (bytes == 0)
             { return; }
             serialPort1.Read(buffer, 0, bytes);
             string s100 = ByteArrayToHexString(buffer);//字节数组转为十六进制字符串
             richTextBox1.Text += s100 + "\r\n";    
  我也觉得 应该会有编码传唤的 貌似 “string s100 = ByteArrayToHexString(buffer);”此代码不可少啊
  请会的朋友给个完整的思路 一步一步如何下来的 ,小弟不胜感激啊!!!!!
------解决方案--------------------ByteArrayToHexString从字面上看,这个函数有毛病。。什么叫“十六进制字符串”?。。。本来好好的byte数组,非要转成hex的字符串。。
比如串口回来的是"12345"这个字符串,byte数组是0x30,0x31,0x32,0x33,0x34,0x35。。转成HexString就成了"303132333435"。。本来可以直接用的,现在变成没法用了。。
串口接收的数据如果没有封包,可以直接用ReadToEnd得到字符串。。如果中文则用Encoding.GetString。。下面类似。。
如果封包了,需要掐头去尾,然后得到byte[],然后你可以直接用。。或者转。。
一切都是根据你通信的格式来的。。。没有定论。。
------解决方案--------------------ByteArrayToHexString用来输出信息是可以的.
串口我认为有2点注意
1 用多线程读串口,不阻塞主线程
2 接收数据后,根据你的业务逻辑处理数据,基本上用到委托来更新UI
------解决方案--------------------// <summary>
       /// 系统参数设置
       /// </summary>
       /// <param name="sender"></param>
       /// <param name="e"></param>
       private void mnuSystemSet_Click(object sender, EventArgs e)
       {
           if (ComPortValid)  
           {
               using (frmPwd fp = new frmPwd())
               {
                   if (fp.ShowDialog() == DialogResult.OK)
                   {
                       //判断COM端口是否已打开
                       GetTempEnable(false);
                       try
                       {
                           DgLocation = DotLocation(int.Parse(SendReadCmd(Address.A07H)));
                       }
                       catch
                       {
                           DgLocation = 10;
                       }
                       using (frmSysSet fsys = new frmSysSet
                           (GetSystemProperties(), DgLocation))
                       {
                           if (fsys.ShowDialog() == DialogResult.OK)
                           {
                               SaveSerialSystemProperties(fsys.SerialSet);
                               LoadDefaultTemp();
                           }
                       }
                       GetTempEnable(true);
                   }
               }