資源簡介
最近工作中需要實現(xiàn)遠程抄表功能,電表通訊協(xié)義為modbus,通過RS485與上位機(電腦)通訊。
網上搜索了好多資料,發(fā)現(xiàn)大部分的示例寫出來的modbus協(xié)議都是錯誤的,特別是最后面的兩位檢驗碼,于是把這個可用的分享給大家。
代碼片段和文件信息
using?System;
using?System.Collections.Generic;
using?System.ComponentModel;
using?System.Data;
using?System.Drawing;
using?System.Linq;
using?System.Text;
using?System.Windows.Forms;
using?System.IO.Ports;
using?System.Text.Regularexpressions;
namespace?SerialportSample
{
????public?partial?class?SerialportSampleForm?:?Form
????{
????????private?SerialPort?comm?=?new?SerialPort();
????????private?ModbusCRC?crc?=?new?ModbusCRC();
????????private?StringBuilder?builder?=?new?StringBuilder();//避免在事件處理方法中反復的創(chuàng)建,定義到外面。
????????private?long?received_count?=?0;//接收計數(shù)
????????private?long?send_count?=?0;//發(fā)送計數(shù)
????????public?SerialportSampleForm()
????????{
????????????InitializeComponent();
????????}
????????//窗體初始化
????????private?void?Form1_Load(object?sender?EventArgs?e)
????????{
????????????//初始化下拉串口名稱列表框
????????????string[]?ports?=?SerialPort.GetPortNames();
????????????Array.Sort(ports);
????????????comboPortName.Items.AddRange(ports);
????????????comboPortName.SelectedIndex?=?comboPortName.Items.Count?>?0???0?:?-1;
????????????comboBaudrate.SelectedIndex?=?comboBaudrate.Items.IndexOf(“4800“);
????????????//初始化SerialPort對象
????????????comm.NewLine?=?“\r\n“;
????????????comm.RtsEnable?=?true;//根據實際情況吧。
????????????buttonSend.Enabled?=?false;
????????????//添加事件注冊
????????????comm.DataReceived?+=?comm_DataReceived;
????????}
????????void?comm_DataReceived(object?sender?SerialDataReceivedEventArgs?e)
????????{
????????????int?n?=?comm.BytesToRead;//先記錄下來,避免某種原因,人為的原因,操作幾次之間時間長,緩存不一致
????????????byte[]?buf?=?new?byte[n];//聲明一個臨時數(shù)組存儲當前來的串口數(shù)據
????????????received_count?+=?n;//增加接收計數(shù)
????????????comm.Read(buf?0?n);//讀取緩沖數(shù)據
????????????builder.Clear();//清除字符串構造器的內容
????????????//因為要訪問ui資源,所以需要使用invoke方式同步ui。
????????????this.Invoke((EventHandler)(delegate
????????????{
????????????????//判斷是否是顯示為16禁止
????????????????if?(checkBoxHexView.Checked)
????????????????{
????????????????????//依次的拼接出16進制字符串
????????????????????foreach?(byte?b?in?buf)
????????????????????{
????????????????????????builder.Append(b.ToString(“X2“)?+?“?“);
????????????????????}
????????????????}
????????????????else
????????????????{
????????????????????//直接按ASCII規(guī)則轉換成字符串
????????????????????builder.Append(Encoding.ASCII.GetString(buf));
????????????????}
????????????????//追加的形式添加到文本框末端,并滾動到最后。
????????????????this.txGet.AppendText(builder.ToString());
????????????????//修改接收計數(shù)
????????????????labelGetCount.Text?=?“Get:“?+?received_count.ToString();
????????????}));
????????}
????????private?void?buttonOpenClose_Click(object?sender?EventArgs?e)
????????{
????????????//根據當前串口對象,來判斷操作
????????????if?(comm.IsOpen)
????????????{
????????????????//打開時點擊,則關閉串口
????????????????comm.Close();
????????????????buttonSend.Enabled?=?false;
????????????}
????????????else
????????????{
????????????????//關閉時點擊,則設置好端口,波特率后打開
????????????????comm.PortName?=?comboPortName.Text;
????????????????comm.BaudRat
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????17920??2015-01-23?10:30??SerialportSample\SerialportSample\bin\Debug\SerialportSample.exe
?????文件??????44544??2015-01-23?10:30??SerialportSample\SerialportSample\bin\Debug\SerialportSample.pdb
?????文件??????22984??2015-01-23?10:30??SerialportSample\SerialportSample\bin\Debug\SerialportSample.vshost.exe
?????文件????????490??2010-03-18?12:39??SerialportSample\SerialportSample\bin\Debug\SerialportSample.vshost.exe.manifest
?????文件???????6247??2014-11-28?14:15??SerialportSample\SerialportSample\Form1.cs
?????文件??????16892??2014-11-27?14:48??SerialportSample\SerialportSample\Form1.Designer.cs
?????文件???????5817??2014-11-27?14:48??SerialportSample\SerialportSample\Form1.resx
?????文件???????4797??2014-11-28?14:16??SerialportSample\SerialportSample\ModbusCRC.cs
?????文件???????5420??2014-11-26?14:06??SerialportSample\SerialportSample\obj\x86\Debug\DesignTimeResolveAssemblyReferences.cache
?????文件???????7056??2015-01-23?10:30??SerialportSample\SerialportSample\obj\x86\Debug\DesignTimeResolveAssemblyReferencesInput.cache
?????文件????????312??2014-04-02?12:49??SerialportSample\SerialportSample\obj\x86\Debug\GenerateResource.read.1.tlog
?????文件????????788??2014-04-02?12:49??SerialportSample\SerialportSample\obj\x86\Debug\GenerateResource.write.1.tlog
?????文件???????7897??2014-04-08?13:54??SerialportSample\SerialportSample\obj\x86\Debug\ResolveAssemblyReference.cache
?????文件???????3419??2015-01-23?10:30??SerialportSample\SerialportSample\obj\x86\Debug\SerialportSample.csproj.FileListAbsolute.txt
?????文件????????975??2014-11-28?14:16??SerialportSample\SerialportSample\obj\x86\Debug\SerialportSample.csproj.GenerateResource.Cache
?????文件???????9174??2015-01-23?10:30??SerialportSample\SerialportSample\obj\x86\Debug\SerialportSample.csprojResolveAssemblyReference.cache
?????文件??????17920??2015-01-23?10:30??SerialportSample\SerialportSample\obj\x86\Debug\SerialportSample.exe
?????文件??????44544??2015-01-23?10:30??SerialportSample\SerialportSample\obj\x86\Debug\SerialportSample.pdb
?????文件????????180??2015-01-23?10:30??SerialportSample\SerialportSample\obj\x86\Debug\SerialportSample.Properties.Resources.resources
?????文件????????180??2015-01-23?10:30??SerialportSample\SerialportSample\obj\x86\Debug\SerialportSample.SerialportSampleForm.resources
?????文件????????523??2010-05-16?03:24??SerialportSample\SerialportSample\Program.cs
?????文件???????1468??2010-05-16?02:19??SerialportSample\SerialportSample\Properties\AssemblyInfo.cs
?????文件???????2858??2010-05-16?02:19??SerialportSample\SerialportSample\Properties\Resources.Designer.cs
?????文件???????5612??2010-05-16?02:19??SerialportSample\SerialportSample\Properties\Resources.resx
?????文件???????1099??2010-05-16?02:19??SerialportSample\SerialportSample\Properties\Settings.Designer.cs
?????文件????????249??2010-05-16?02:19??SerialportSample\SerialportSample\Properties\Settings.settings
?????文件???????3773??2014-11-28?17:41??SerialportSample\SerialportSample\SerialportSample.csproj
?????文件???????1240??2014-11-28?17:41??SerialportSample\SerialportSample\uSerialPort.cs
?????文件????????890??2010-05-16?02:19??SerialportSample\SerialportSample.sln
????..A..H.?????21504??2014-04-08?13:56??SerialportSample\SerialportSample.suo
............此處省略14個文件信息
評論
共有 條評論