基本信息
源码名称:C#串口助手(源码)
源码大小:0.23M
文件格式:.rar
开发语言:C#
更新时间:2019-10-22
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
串口 调试助手,实现了 接收、发送串口消息 功能
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO.Ports; namespace SerialComm { public partial class Form1 : Form { //=================================================== //申明全局变量。 public int CmdIdx = 0; //命令发送指针初始为0。 bool IsReceving = false; //接收数据标志。 bool DoingStr = false; //处理字符串标志。 bool DoingHex = false; //处理十六进制标志。 //=================================================== public Form1() { InitializeComponent(); } private void IntToHex() { try { int Int = int.Parse(tbDec.Text); string TempStr = Convert.ToString(Int, 16); while(TempStr.Length < 8 ) TempStr = '0' TempStr; tbHex.Text = TempStr.ToUpper(); tbDec.SelectAll(); } catch (Exception Err) { tbDec.SelectAll(); MessageBox.Show(Err.Message, "串口调试助手"); } } private void HexToInt() { try { int Int = Convert.ToInt32(tbHex.Text,16); tbDec.Text = Int.ToString(); tbHex.SelectAll(); } catch (Exception Err) { tbHex.SelectAll(); MessageBox.Show(Err.Message, "串口调试助手"); } } private void CmdClick(int idx) { //发送命令。 try { //自动打开端口。 if (!sComm.IsOpen) btOpen_Click(null, null); string TempStr = string.Empty; switch(idx) { case 1: TempStr = tbCmd1.Text; break; case 2: TempStr = tbCmd2.Text; break; case 3: TempStr = tbCmd3.Text; break; case 4: TempStr = tbCmd4.Text; break; case 5: TempStr = tbCmd5.Text; break; default: return; } TempStr = DelSpace(TempStr); if (cbDefFrm.Checked) //自动添加帧头帧尾和校验 { TempStr=DelSpace(tbStart.Text) TempStr; //加入头。 //转换为字节数组。 int Len=TempStr.Length; //待校验的字符串长度。 byte[] VerBin = new byte[Len / 2]; int j=0; for(int i=0;i<Len;i =2,j ) { VerBin[j] = Convert.ToByte(TempStr.Substring(i, 2), 16); } //计算校验字节。 byte VerByte=0; if (rdXor.Checked) { for (int i = 0; i < VerBin.Length; i ) VerByte ^= VerBin[i]; //异或校验。 } else if (rdAdd.Checked) { for (int i = 0; i < VerBin.Length; i ) VerByte = VerBin[i]; //和校验。 } //校验字节转为HEX字符串。 string VerStr = Convert.ToString(VerByte, 16); //合成一帧。 TempStr = TempStr DelSpace(VerStr) DelSpace(tbEnd.Text); } SendAsHex(TempStr); } catch (Exception err) { TimeHex.Stop(); TimeHex.Enabled = false; MessageBox.Show(err.Message, "串口调试助手"); cbTimeHex.Checked = false; } } private void ClrEncode() { lbHexData.Text = string.Empty; tbByte1.Text = string.Empty; tbByte2.Text = string.Empty; tbByte3.Text = string.Empty; tbByte4.Text = string.Empty; tbUInt16L.Text = string.Empty; tbUInt16R.Text = string.Empty; tbUInt32.Text = string.Empty; tbSByte1.Text = string.Empty; tbSByte2.Text = string.Empty; tbSByte3.Text = string.Empty; tbSByte4.Text = string.Empty; tbInt16L.Text = string.Empty; tbInt16R.Text = string.Empty; tbInt32.Text = string.Empty; } private void SendAsHex(string str) { int Len = str.Length; //组包发送。 byte[] send = new byte[Len / 2]; int j = 0; for (int i = 0; i < Len; i = i 2, j ) send[j] = Convert.ToByte(str.Substring(i, 2), 16); sComm.Write(send, 0, send.Length); } //清除空格。 private string DelSpace(string str) { string TempStr = string.Empty; int Len = str.Length; for (int i = 0; i < Len; i ) { if (str[i] != ' ') TempStr = str[i]; } //Hex 位数检查。 Len = TempStr.Length; if (Len % 2 != 0) TempStr = '0' TempStr; return TempStr; } //重新打开端口。 private void ReOpenPort() { try { btClose_Click(null,null); //重新打开通讯端口。 if (!sComm.IsOpen) btOpen_Click(null, null); } catch (Exception Err) { MessageBox.Show(Err.Message, "串口调试助手"); } } private void Form1_Load(object sender, EventArgs e) { try { foreach (string com in System.IO.Ports.SerialPort.GetPortNames()) //自动获取串行口名称 this.cmPort.Items.Add(com); cmPort.SelectedIndex = 0; } catch { MessageBox.Show("找不到通讯端口!", "串口调试助手"); } } private void OpenPort() { //***避免串口死锁*** sComm.WriteTimeout = 1000; //写超时,如果底层串口驱动效率问题,能有效的避免死锁。 sComm.ReadTimeout = 1000; //读超时,同上。 sComm.NewLine = "\r\n"; //回车换行。 sComm.DataReceived = new System.IO.Ports.SerialDataReceivedEventHandler(this.sComm_DataReceived); //注册事件。 //***避免串口死锁*** sComm.PortName = cmPort.Text; sComm.BaudRate = int.Parse(cmBaudRate.Text); sComm.DataBits = int.Parse(cmDataBit.Text); sComm.Parity = (Parity)Enum.Parse(typeof(Parity), cmParity.Text); sComm.StopBits = (StopBits)Enum.Parse(typeof(StopBits), cmStopBit.Text); sComm.Open(); } private void ClosePort() { //安全关闭当前串口。 //***避免串口死锁*** sComm.DataReceived -= this.sComm_DataReceived; //注销串口中断接收事件,避免下次再执行进来,造成死锁。 while(IsReceving) Application.DoEvents(); //处理串口接收事件及其它系统消息。 sComm.Close(); //现在没有死锁,可以关闭串口。 //***避免串口死锁*** } private void StopAutoSend() { //停止自动发送字符串。 TimeStr.Stop(); TimeStr.Enabled = false; tbTimeStr.Enabled = true; cbTimeStr.Checked = false; //停止自动发送命令。 TimeHex.Stop(); TimeHex.Enabled = false; tbTimeHex.Enabled = true; cbTimeHex.Checked = false; } //=================================================== private void btOpen_Click(object sender, EventArgs e) { try { OpenPort(); //安全打开串口。 if (sComm.IsOpen) { btClose.Enabled = true; btOpen.Enabled = false; lbComStat.Text = "已打开 " Convert.ToString(sComm.PortName) ' ' Convert.ToString(sComm.BaudRate) ' ' Convert.ToString(sComm.DataBits) ' ' Convert.ToString(sComm.Parity) ' ' Convert.ToString(sComm.StopBits); tbSendStr.Focus(); } } catch (Exception er) { StopAutoSend(); //停止自动发送。 ClosePort(); //安全关闭当前串口。 MessageBox.Show("端口打开失败!" er.Message, "串口调试助手"); lbComStat.Text = "已关闭"; } } private void btSend_Click(object sender, EventArgs e) { //自动打开端口。 if (!sComm.IsOpen) btOpen_Click(null, null); //发送文本。 try { string txt = tbSendStr.Text; Byte[] EncodeByte = new byte[txt.Length * 2]; EncodeByte = Encoding.GetEncoding("GB2312").GetBytes(txt); int Len = EncodeByte.Length; sComm.Write(EncodeByte, 0, Len); } catch (Exception err) { MessageBox.Show(err.Message, "串口调试助手"); } } private void btClrSend_Click(object sender, EventArgs e) { tbSendStr.Text = string.Empty; } private void cmPort_MouseDown(object sender, MouseEventArgs e) { try { cmPort.Items.Clear(); foreach (string com in System.IO.Ports.SerialPort.GetPortNames()) //自动获取串行口名称 this.cmPort.Items.Add(com); } catch { MessageBox.Show("找不到通讯端口!", "串口调试助手"); } } private void sComm_DataReceived(object sender, SerialDataReceivedEventArgs e) { try { IsReceving = true; //***正在接收状态指示。 //读入收到的数据。 int Len = sComm.BytesToRead; if (Len < 1) { IsReceving = false; //***接收完成状态指示。 return; } byte[] data = new byte[Len]; sComm.Read(data, 0, Len); //字符串处理。 string Str = Encoding.GetEncoding("GB2312").GetString(data); //数据转十六进制字符串。 string Hex = string.Empty; for (int i = 0; i < data.Length; i ) { string tempstr = Convert.ToString(data[i], 16); if (tempstr.Length < 2) tempstr = '0' tempstr; Hex = tempstr ' '; } Hex = Hex.ToUpper(); //使用委托跨线程读取数据。 rtbRecStr.Invoke(new EventHandler(delegate { DoingStr = true; //***正在处理字符串。 rtbRecStr.AppendText(Str); if (cbAutoClr.Checked && rtbRecStr.Text.Length > 10000) rtbRecStr.Text = string.Empty; rtbRecStr.ScrollToCaret(); //将控件的内容滚动到当前位置。 DoingStr = false; } )); rtbRecHex.Invoke(new EventHandler(delegate { DoingHex = true; //***正在处理十六进制数据。 rtbRecHex.AppendText(Hex); if (cbAutoClr.Checked && rtbRecHex.Text.Length > 10000) rtbRecHex.Text = string.Empty; rtbRecHex.ScrollToCaret(); //将控件的内容滚动到当前位置。 DoingHex = false; } )); while(DoingStr || DoingHex) Application.DoEvents(); //处理串口接收事件及其它系统消息。 IsReceving =false; //***接收完成状态指示。 } catch (Exception Err) { MessageBox.Show(Err.Message, "串口调试助手"); } } private void btClrRec_Click(object sender, EventArgs e) { rtbRecStr.Text = string.Empty; rtbRecHex.Text = string.Empty; ClrEncode(); } private void rtbRecHex_MouseClick(object sender, MouseEventArgs e) { try { int idx = rtbRecHex.SelectionStart / 3; idx *= 3; if (rtbRecHex.Text.Length >= idx 4 * 3) { rtbRecHex.Select(idx, 4 * 3); string SubStr = rtbRecHex.Text.Substring(idx, 4 * 3); lbHexData.Text = SubStr; string[] TempStr = SubStr.Split(' '); string[] Frm=new string[4]; if(rdBig.Checked) { //直接拷贝。 Array.Copy(TempStr, Frm, Frm.Length); } else { //前后交换。 Frm[0] = TempStr[3]; Frm[1] = TempStr[2]; Frm[2] = TempStr[1]; Frm[3] = TempStr[0]; } //数据解码。 tbByte1.Text = Convert.ToString(Convert.ToByte(Frm[0], 16), 10); tbByte2.Text = Convert.ToString(Convert.ToByte(Frm[1], 16), 10); tbByte3.Text = Convert.ToString(Convert.ToByte(Frm[2], 16), 10); tbByte4.Text = Convert.ToString(Convert.ToByte(Frm[3], 16), 10); tbUInt16L.Text = Convert.ToString(Convert.ToUInt16(Frm[0] Frm[1], 16), 10); tbUInt16R.Text = Convert.ToString(Convert.ToUInt16(Frm[2] Frm[3], 16), 10); tbUInt32.Text = Convert.ToString(Convert.ToUInt32(Frm[0] Frm[1] Frm[2] Frm[3], 16), 10); tbSByte1.Text = Convert.ToString(Convert.ToSByte(Frm[0], 16), 10); tbSByte2.Text = Convert.ToString(Convert.ToSByte(Frm[1], 16), 10); tbSByte3.Text = Convert.ToString(Convert.ToSByte(Frm[2], 16), 10); tbSByte4.Text = Convert.ToString(Convert.ToSByte(Frm[3], 16), 10); tbInt16L.Text = Convert.ToString(Convert.ToInt16(Frm[0] Frm[1], 16), 10); tbInt16R.Text = Convert.ToString(Convert.ToInt16(Frm[2] Frm[3], 16), 10); tbInt32.Text = Convert.ToString(Convert.ToInt32(Frm[0] Frm[1] Frm[2] Frm[3], 16), 10); } else { ClrEncode(); } } catch (Exception Err) { MessageBox.Show(Err.Message, "串口调试助手"); } } private void rdBig_CheckedChanged(object sender, EventArgs e) { rtbRecHex_MouseClick(null, null); //重新刷新数据解码。 } private void cbDefFrm_CheckedChanged(object sender, EventArgs e) { if (cbDefFrm.Checked) { gpDefFrm.Enabled = true; } else { gpDefFrm.Enabled = false; } } private void cbTimeHex_CheckedChanged(object sender, EventArgs e) { try { if (cbTimeHex.Checked) { //禁止Str自动发送。 cbTimeStr.Checked = false; int t=int.Parse(tbTimeHex.Text); if (t < 5) { t = 5; tbTimeHex.Text = Convert.ToString(t,10); } //起动Hex自动发送。 tbTimeHex.Enabled = false; TimeHex.Enabled = true; TimeHex.Interval = t; TimeHex.Start(); } else { TimeHex.Stop(); TimeHex.Enabled = false; tbTimeHex.Enabled = true; } } catch (Exception Err) { MessageBox.Show("定时值不正确!" Err.Message, "串口调试助手"); } } private void cbTimeStr_CheckedChanged(object sender, EventArgs e) { try { if (cbTimeStr.Checked) { //禁止Hex自动发送。 cbTimeHex.Checked = false; int t = int.Parse(tbTimeStr.Text); if (t < 5) { t = 5; tbTimeStr.Text = Convert.ToString(t,10); } //启动Str自动发送。 tbTimeStr.Enabled = false; TimeStr.Enabled = true; TimeStr.Interval = t; TimeStr.Start(); } else { TimeStr.Stop(); TimeStr.Enabled = false; tbTimeStr.Enabled = true; } } catch (Exception Err) { MessageBox.Show("定时值不正确!" Err.Message, "串口调试助手"); } } private void btCmd1_Click(object sender, EventArgs e) { CmdClick(1); } private void btCmd2_Click(object sender, EventArgs e) { CmdClick(2); } private void btCmd3_Click(object sender, EventArgs e) { CmdClick(3); } private void btCmd4_Click(object sender, EventArgs e) { CmdClick(4); } private void btCmd5_Click(object sender, EventArgs e) { CmdClick(5); } private void cmPort_SelectedIndexChanged(object sender, EventArgs e) { ReOpenPort(); } private void cmBaudRate_SelectedIndexChanged(object sender, EventArgs e) { ReOpenPort(); } private void cmDataBit_SelectedIndexChanged(object sender, EventArgs e) { ReOpenPort(); } private void cmParity_SelectedIndexChanged(object sender, EventArgs e) { ReOpenPort(); } private void cmStopBit_SelectedIndexChanged(object sender, EventArgs e) { ReOpenPort(); } private void TimeHex_Tick(object sender, EventArgs e) { try { int[] Len ={ tbCmd1.Text.Length,tbCmd2.Text.Length,tbCmd3.Text.Length,tbCmd4.Text.Length,tbCmd5.Text.Length}; int j = 0; int OldIdx=CmdIdx; for (int i = OldIdx; i<OldIdx 5; i ) { CmdIdx %= 5; j = i % 5; if (CmdIdx == j) { CmdIdx ; if (Len[j] > 0) { CmdClick(CmdIdx); return; } } } } catch (Exception Err) { MessageBox.Show("定时发送错误!" Err.Message, "串口调试助手"); cbTimeHex.Checked = false; } } private void TimeStr_Tick(object sender, EventArgs e) { try { btSend_Click(null, null); } catch (Exception Err) { MessageBox.Show("定时发送错误!" Err.Message, "串口调试助手"); cbTimeStr.Checked = false; } } private void tbDec_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == '\r') //回车键 IntToHex(); //转换为Hex。 } private void tbDec_Leave(object sender, EventArgs e) { IntToHex(); } private void tbHex_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == '\r') //回车键 { while (tbHex.Text.Length < 8) tbHex.Text = '0' tbHex.Text; HexToInt(); //转换为Dec。 } } private void tbHex_Leave(object sender, EventArgs e) { while (tbHex.Text.Length < 8) tbHex.Text = '0' tbHex.Text; HexToInt(); //转换为Dec。 } private void btClose_Click(object sender, EventArgs e) { StopAutoSend(); //停止自动发送。 ClosePort(); //安全关闭串口。 if (!sComm.IsOpen) { btOpen.Enabled = true; btClose.Enabled = false; lbComStat.Text = "已关闭"; } } private void btQuit_Click(object sender, EventArgs e) { btClose_Click(null, null); this.Close(); } //=================================================== } }