ä¸ä½æºï¼C#ï¼éè¦ååçæºéè¿ä¸²å£ä¼ è¾æ°æ®ï¼æ¬äººä¹æ¯è¸©äºå 个åä¹åæå°è¯¥åè½å®ç°ï¼æ¶é´æ¯è¾åå¿ï¼åçæ½¦èï¼æä¸æ¸ æ¥çå¯ä»¥è¿½é®ã
åçæºä¸å·²ç»å®ä¹å¥½äºæ¥å£åæ°æ®æ ¼å¼ï¼ç»æï¼
ä¸ä½æºä¸å¤çæ¹æ³ï¼
1ã䏲壿¥æ¶å°byteæ°ç»ï¼ä»æ°ç»ä¸æä¸æ è·å
å¦ææ°æ®ç»æåä¸è¿ä¸ªæ¹æ³æªå°ä¸å¯ï¼å¦ææ°æ®ç»æè¾å¤ï¼ç»æä½è¾å¤§ é£ä¹éè¦è®¤çç计ç®ä¸æ ï¼å¦åå¾å®¹æåºç°é®é¢ï¼ä¸ä¸æç»´æ¤ã
ä¾å¦ï¼
private void sp_DataReceived(object sender, EventArgs e)
      {
      SerialPort sp1 = (SerialPort)sender;
      if (sp1.IsOpen)   //夿æ¯å¦æå¼ä¸²å£
      {
        try
        {
          if (this.InvokeRequired) //å 线ç¨é²æ¢åæ»
          {
            this.Invoke(new MethodInvoker(delegate
            {
              int int_len = sp1.BytesToRead;
              byte[] b = new byte[sp1.BytesToRead];
              sp1.Read(b, 0, b.Length); //åè
              myBuffer.AddRange(b);
              while (myBuffer.Count >= 15)//è³å°çäºæ¥æå¤´é¿åº¦
              {
                if (myBuffer[0] == 0xf9 && Array.IndexOf(CMDS, myBuffer[1]) >= 0)
                {
                  int strLen = (myBuffer[2] << 8) + myBuffer[3]+6;
                  if (strLen > myBuffer.Count)
                  {
                    break;
                  }
                  int cmpType = (myBuffer[5] << 8) + myBuffer[6];
                  switch (cmpType)
                  {
Â
                    case 0x0B11:
                      sp.DiscardInBuffer();
                      sp.DiscardOutBuffer();
                      myBuffer.RemoveRange(0, myBuffer.Count);
                      break;
            Â
                    default:
                      break;
                  }
                  myBuffer.RemoveRange(0, myBuffer.Count);
                }
                else
                {
                  myBuffer.RemoveRange(0, 1);
                }
              }
            }));
          }
        }
        catch (Exception ex)
        {
          MessageBox.Show(ex.Message);
        }
      }
    }
æ¹æ³2 å°åçæºä¸çæ°æ®ç»æå®ä¹å° ä¸ä½æºä¸
Â
1ã对åºååæºå®ä¹ä¸ä¸ªä¸æ ·çç»æ ç¨äºæ¥æ¶æ°æ® (åçæºä¸å·²å®ä¹Â #parama  pack(1)) æ»ä¹ åçæºå ä¸ä½æºä¸ç pack(x)è¦ä¸è´
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
    public struct TEST
    {
      byte a;
      [MarshalAs(UnmanagedType.ByValArray, SizeConst = 28)]
      byte[] b;/
      byte c;
      [MarshalAs(UnmanagedType.ByValArray, SizeConst = 28)]
      char[] d;
      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 200)]
      string e;// åçæºä¸å®ä¹çé¿åº¦æ¯å¤å°Â Â
    Â
      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)]
      string login_data;//Â
    }
注æäºé¡¹: 1ã[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] æ¯ç»æç坹齿¹å¼ ï¼pack=1 æ¯æç»æç坹齿¹å¼ä¸º1åèãå¦åé»è®¤æ¯4个åèï¼ä¸æå®packæ¹å¼ï¼ä¼åç°åæ ·çç»æä½ï¼sizeofï¼ç»æï¼ç大å°ä¸ä¸æ ·ï¼ä»¥è³äºåºç°byteæ°ç»è½¬ç»æçæ¶åï¼æ°æ®å¯¹åºä¸ä¸ï¼
妿ä¸ä½¿ç¨æè     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)] ä¸UnmanagedType.ByValTSträ¸ç»æä¸å ç´ ä¸å¯¹åº,使ç¨å¨ä½¿ç¨sizeofçæ¶å伿¥Â
Marshal.SizeOfæ¥âä¸è½ä½ä¸ºéæç®¡ç»æè¿è¡å°éå¤çï¼æ æ³è®¡ç®ææä¹ç大尿åç§»éâé误ã
2ãåçæºä¸å符串使ç¨char[200],å®é¿Â  Â
c#ä¸ç»æå¯ä»¥ä½¿ç¨stringï¼ä½æ¯ä¹è¦å®é¿ï¼å®é¿ä½¿ç¨UnmanagedType.ByValTStrï¼ï¼å®é¿çæ¹æ³
    //
    // æè¦:
    //   ç¨äºå¨ç»æä¸åºç°çå èå®é¿å符æ°ç»ãchar ç±»åç¨äº System.Runtime.InteropServices.UnmanagedType.ByValTStr
    //   åå³äº System.Runtime.InteropServices.StructLayoutAttribute 屿§ç System.Runtime.InteropServices.CharSet
    // Â Â åæ°åºç¨äºå å«çç»æãåºå§ç»ä½¿ç¨ System.Runtime.InteropServices.MarshalAsAttribute.SizeConst
    // Â Â åæ®µæ¥æç¤ºæ°ç»ç大å°ã
  [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 200)]
      string e;// åçæºä¸å®ä¹çé¿åº¦æ¯å¤å°Â Â
åçæºä¸å符串使ç¨unsigned char[28],å®é¿ä¸UnmanagedType.ByValArray, ç¨äºåå¨ éåç¬¦ä¸²çæ°ç»
    //
    // æè¦:
    // Â Â å½ System.Runtime.InteropServices.MarshalAsAttribute.Value 屿§è®¾ç½®ä¸º ByValArrayæ¶ï¼å¿ 须设置
    //   System.Runtime.InteropServices.MarshalAsAttribute.SizeConst åæ®µæç¤ºå ç´ æ°ãæ°ç»çãå½éè¦åºååç¬¦ä¸²ç±»åæ¶ï¼System.Runtime.InteropServices.MarshalAsAttribute.ArraySubType
    // Â Â åæ®µå¯ä»¥éæ©å 嫿°ç»å ç´ ç System.Runtime.InteropServices.UnmanagedTypeãå¯ä»¥ä½¿ç¨æ¤ä» System.Runtime.InteropServices.UnmanagedType
    //   æ°ç»ä¸å ç´ çå½¢å¼åºç°å¨ç»æä¸çåæ®µç屿§ã
  [MarshalAs(UnmanagedType.ByValArray, SizeConst = 28)]
      char[] d;
Â
ç»æä½åæ°ç»äºè½¬ï¼//伪代ç
  public TESTtest= new TEST();
æ°ç»è½¬ç»æï¼
List<byte> myBuffer = new List<byte>();
    private void sp_DataReceived(object sender, EventArgs e)
      {
      SerialPort sp1 = (SerialPort)sender;
      if (sp1.IsOpen)   //夿æ¯å¦æå¼ä¸²å£
      {
        try
        {
          if (this.InvokeRequired) //å 线ç¨é²æ¢åæ»
          {
            this.Invoke(new MethodInvoker(delegate
            {
              //  Thread.Sleep(20);
              int int_len = sp1.BytesToRead;
              byte[] b = new byte[sp1.BytesToRead];
              sp1.Read(b, 0, b.Length); //åè
              myBuffer.AddRange(b);
              while (myBuffer.Count >= sizeof(TEST))//è³å°çäºæ¥æé¿åº¦
              {
                try
                {
                  test= (TEST)BytesToStruct(myBuffer.ToArray(), typeof(TEST));
               }catch()
               {
                  myBuffer.RemoveRange(0, 1);
                 }
                    Â
                     Â
                  }
                  myBuffer.RemoveRange(0, myBuffer.Count);
                }
              }
            }));
          }
        }
        catch (Exception ex)
        {
          MessageBox.Show(ex.Message);
        }
      }
    }
ç»æè½¬æ°ç»ï¼
        byte[] s = StructToBytes(test);
Â
è½¬æ¢æ¹æ³ï¼
   Â
/// <summary>
    /// ç»æä½è½¬åæbyte[]
    /// </summary>
    /// <param name="structure"></param>
    /// <returns></returns>
    public static Byte[] StructToBytes(Object structure)
    {
      Int32 size = Marshal.SizeOf(structure);
      IntPtr buffer = Marshal.AllocHGlobal(size);
      try
      {
        Marshal.StructureToPtr(structure, buffer, false);
        Byte[] bytes = new Byte[size];
        Marshal.Copy(buffer, bytes, 0, size);
        return bytes;
      }
      finally
      {
        Marshal.FreeHGlobal(buffer);
      }
    }
    /// <summary>
    /// byte[]转åæç»æä½
    /// </summary>
    /// <param name="bytes"></param>
    /// <param name="strcutType"></param>
    /// <returns></returns>
    public static Object BytesToStruct(Byte[] bytes, Type strcutType)
    {
      Int32 size = Marshal.SizeOf(strcutType);
      IntPtr buffer = Marshal.AllocHGlobal(size);
      try
      {
        Marshal.Copy(bytes, 0, buffer, size);
        return Marshal.PtrToStructure(buffer, strcutType);
      }
      finally
      {
        Marshal.FreeHGlobal(buffer);
      }
    }
Â
声æï¼è½¬æ¢æ¹æ³æ¯æèªçå¿ç½åçï¼è¿½ç©¶å¯å
Â