SerialPort实现与地磅通信

来源:互联网 发布:软件销售是卖软件吗 编辑:程序博客网 时间:2024/04/27 14:28

1.拖一个serialPort 命名sp。

2.

.关键在于DataReceived事件的处理

.波特率设定与仪表设置一致:1200

.ReadBufferSize可设置为通信协定的数据长度:12

.注意起始与结束编码:0x02, 0x03

.Invoke实现委托,使得辅助线程修改主线程控件内容(也可以设置CheckForIllegalCrossThreadCalls直接跨线程作业)

(参考:http://www.cnblogs.com/worldreason/archive/2008/06/09/1216127.html )

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Windows.Forms;
  8. using System.IO.Ports;
  9. using System.Threading;
  10. namespace WMS.SD.DeliveryGoods
  11. {
  12.     public partial class frmUpLoad : Form
  13.     {
  14.         private delegate void HandleInterfaceUpdateDelegate(string aString);
  15.         HandleInterfaceUpdateDelegate interfaceUpdateHandle;
  16.         static string strReceive;   //   接收到数据的缓冲区 
  17.         public frmUpLoad()
  18.         {
  19.             InitializeComponent();
  20.         }
  21.         private void frmUpLoad_Load(object sender, EventArgs e)
  22.         {
  23.             //是否允许跨线程访问
  24.            // CheckForIllegalCrossThreadCalls = false;      
  25.             interfaceUpdateHandle = new HandleInterfaceUpdateDelegate(ShowText);
  26.             try
  27.             {
  28.                 if (!sp.IsOpen)
  29.                 {
  30.                     sp.Open();//打开串口方法 
  31.                 }
  32.                 btnGetWeight.Enabled = false;
  33.             }//抛出异常 
  34.             catch (Exception ex)
  35.             {
  36.                 MessageBox.Show(ex.Message.ToString());
  37.             }
  38.         }
  39.         private void ShowText(string aString)
  40.         {
  41.             //根据通信数据规格显示数据
  42.             this.lblData.Text = aString.Substring(1, 5) + "." + aString.Substring(5, 1);
  43.         }
  44.         private void btnGetWeight_Click(object sender, EventArgs e)
  45.         {
  46.             try
  47.             {
  48.                 btnGetWeight.Enabled = false;
  49.                 if (!sp.IsOpen)
  50.                 {
  51.                     Thread.Sleep(5000);
  52.                     sp.Open();//打开串口方法 
  53.                 }
  54.             }//抛出异常 
  55.             catch (Exception ex)
  56.             {
  57.                 MessageBox.Show(ex.Message.ToString());
  58.             }
  59.         }
  60.         private void sp_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
  61.         {
  62.             try
  63.             {
  64.                 //取得第一个字节 
  65.                 if (sp.IsOpen)
  66.                 {
  67.                     byte firstbyte = Convert.ToByte(sp.ReadByte());
  68.                     //判断第一个字节是否是起始位:16进制的0x02 
  69.                     if (firstbyte == 0x02)
  70.                     {
  71.                         //定义接收数据长度 
  72.                         int bytesRead = sp.ReadBufferSize;
  73.                         //数据接收字节数组 
  74.                         byte[] bytesData = new byte[bytesRead];
  75.                         //接收字节 
  76.                         byte byteData;
  77.                         for (int i = 0; i <= bytesRead - 1; i++)
  78.                         {
  79.                             try
  80.                             {
  81.                                 if (sp.IsOpen)
  82.                                 {
  83.                                     byteData = Convert.ToByte(sp.ReadByte());
  84.                                     //判断数据结束字节 
  85.                                     if (byteData == 0x03)
  86.                                     {
  87.                                         break;
  88.                                     }
  89.                                     bytesData[i] = byteData;
  90.                                 }
  91.                             }
  92.                             catch (Exception ex)
  93.                             {
  94.                                // MessageBox.Show( ex.Message + ex.GetType().FullName);
  95.                             }
  96.                         }
  97.                         //将字节数组转换成字符串 
  98.                         strReceive = System.Text.Encoding.Default.GetString(bytesData);
  99.                         //this.lblData.Text = strReceive.Substring(1, 5) + "." + strReceive.Substring(5, 1);
  100.                         // Invoke(interfaceUpdateHandle, strczData);
  101.                          BeginInvoke(interfaceUpdateHandle, strReceive);
  102.                     }
  103.                 }
  104.             }
  105.             catch (Exception ex)
  106.             {
  107.               //  MessageBox.Show(ex.Message + ex.GetType().FullName);
  108.             }
  109.         }
  110.         private void btnexit_Click(object sender, EventArgs e)
  111.         {
  112.             if (sp.IsOpen)
  113.             {
  114.                 sp.DiscardInBuffer();
  115.                 sp.Close();
  116.             }
  117.             this.Close();
  118.         }
  119.         private void btnreset_Click(object sender, EventArgs e)
  120.         {
  121.             try
  122.             {
  123.                 if (sp.IsOpen)
  124.                 {
  125.                     sp.DiscardInBuffer();
  126.                     sp.Close();
  127.                 }
  128.                 this.lblData.Text = "";
  129.                 btnGetWeight.Enabled = true;
  130.             }
  131.             catch (Exception ex)
  132.             {
  133.                 MessageBox.Show(ex.Message);
  134.             }
  135.         }
  136.         private void frmUpLoad_FormClosing(object sender, FormClosingEventArgs e)
  137.         {
  138.             if (sp.IsOpen)
  139.             {
  140.                 sp.DiscardInBuffer();
  141.                 sp.Close();
  142.             }
  143.         }
  144.     }
  145. }