基于c#的工控软件版本v1.03_11.25(附源代码工程下载地址)最新版本

代码地址:http://pan.baidu.com/share/link?shareid=3381776290&uk=588847378

点击打开链接

新版本做了3个方面修改

1,修改了原有的打开关闭的链接图片,改到本地工程中

2,添加了定时发送机制

3,添加的帮助栏

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.Collections;

using System.IO.Ports;

using System.Threading;

using System.Diagnostics;

namespace ComAssistant1

{

public partial class ComAssis : Form

{

public enum LogMsgType { Incoming, Outgoing, Normal, Warning, Error };

public enum DataMode { Text, Hex }

private Color[] LogMsgTypeColor = { Color.Orange, Color.Green, Color.Black, Color.Blue, Color.Red };

/// 准备关闭串口=true

/// </summary>

private bool m_IsTryToClosePort = false;

/// <summary>

/// true表示正在接收数据

/// </summary>

private bool m_IsReceiving = false;

public ComAssis()

{

InitializeComponent();

}

Mutex m_Mutex = null;//锁

bool flag;

private void Form1_Load(object sender, EventArgs e)

{

//判断串口打开或关闭

if (serialPort1.IsOpen)

{

serialPort1.Close();

pictureBox1.Image = ComAssistant1.Properties.Resources.open;

}

else

{

pictureBox1.Image = ComAssistant1.Properties.Resources.close;

}

RefrespictureBox1();

int ii = 0;

foreach (string s in SerialPort.GetPortNames())

{

if (ii >= 1)

{

comboBox1.Items.Add(s);

}

ii++;

}

if (SerialPort.GetPortNames().Length != 0)

{

comboBox1.Text = (string)comboBox1.Items[0];

}

string[] ss = new string[] { "9600", "19200", "57600", "115200" };

comboBox2.DataSource = ss;

comboBox3.DataSource = Enum.GetNames(typeof(Parity));

ss = new string[] { "5", "6", "7", "8" };

comboBox4.DataSource = ss;

comboBox4.Text = "8";

comboBox5.DataSource = Enum.GetNames(typeof(StopBits));

comboBox5.Text = Enum.Format(typeof(StopBits), StopBits.One, "G");

m_Mutex = new Mutex();

flag = false;

}

private void getData(string msg)

{

rtfTerminal.Invoke(new EventHandler(delegate

{

rtfTerminal.AppendText(msg);

//滚动到控件光标处

this.rtfTerminal.ScrollToCaret();

}));

}

private void getByteData(byte[] bb)

{

txtSend.Invoke(new EventHandler(delegate

{

string s = "";

for (int i = 0; i < bb.Length; i++)

{

s += bb[i].ToString() + " ";

}

//txtSend.Items.Add(s);

}));

}

//串口发送方式

#region Local Properties

private DataMode CurrentDataMode

{

get

{

if (tbHex.Checked)

return DataMode.Hex;

else

return DataMode.Text;

}

set

{

if (value == DataMode.Text)

rbText.Checked = true;

else

tbHex.Checked = true;

}

}

#endregion

private void rbHex_CheckedChanged(object sender, EventArgs e)

{

if (rbHex.Checked)

CurrentDataMode = DataMode.Hex;

else

CurrentDataMode = DataMode.Text;

}

private void rbText_CheckedChanged(object sender, EventArgs e)

{

if (rbText.Checked) CurrentDataMode = DataMode.Text;

}

private void Log(LogMsgType msgtype, string msg)

{

/*

* txt文件的换行是\r\n.

textbox里的换行只有\n吧*/

rtfTerminal.Invoke(new EventHandler(delegate

{

rtfTerminal.SelectedText = string.Empty;

rtfTerminal.SelectionFont = new Font(rtfTerminal.SelectionFont, FontStyle.Bold);

rtfTerminal.SelectionColor = LogMsgTypeColor[(int)msgtype];

msg = msg.Replace("\n", "\r\n");

rtfTerminal.AppendText(msg);

rtfTerminal.ScrollToCaret();

}));

}

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)

{

if (m_IsTryToClosePort) // 关键!!!

{

return;

}

m_IsReceiving = true; // 关键!!!

if (flag == true)

{

return;

}

m_Mutex.WaitOne();//这个地方加一个互斥

#if true

try

{

// byte[] data = Convert.FromBase64String(serialPort1.ReadLine());

//  string str = Encoding.Unicode.GetString(data);

// 判断用户用的是字节模式还是字符模式

if (CurrentDataMode == DataMode.Hex)

{

// 读取缓冲区的数据

//   string data = serialPort1.ReadExisting();

// 显示读取的数据到数据窗口

//   Log(LogMsgType.Incoming, data/* + "\n"*/);

#if true

System.Threading.Thread.Sleep(300);

// 获取字节长度

int bytes = serialPort1.BytesToRead;

// 创建字节数组

byte[] readBuffer = new byte[bytes];

// 读取缓冲区的数据到数组

serialPort1.Read(readBuffer, 0, bytes);

this.getData(MyClass.ByteArrayToHexString(readBuffer));

#endif

}

else

{

byte[] readBuffer = new byte[serialPort1.ReadBufferSize];

serialPort1.Read(readBuffer, 0, readBuffer.Length);

#if true

Log(LogMsgType.Incoming, Encoding.ASCII.GetString(readBuffer) + "\r\n");

/* ByteArrayToHexString(readBuffer) + "\n"/*/

#endif

#if false

this.rtfTerminal.Invoke(

//在拥有此控件的基础窗口句柄的线程上执行委托Invoke(Delegate)

//即在textBox_ReceiveDate控件的父窗口form中执行委托.

new MethodInvoker(

/*表示一个委托,该委托可执行托管代码中声明为 void 且不接受任何参数的任何方法。

* 在对控件的 Invoke    方法进行调用时或需要一个简单委托又不想自己定义时可以使用该委托。*/

delegate

{

/*匿名方法,C#2.0的新功能,这是一种允许程序员将一段完整代码区块当成参数传递的程序代码编写技术,

* 通过此种方法可  以直接使用委托来设计事件响应程序以下就是你要在主线程上实现的功能但是有一点要注意,

* 这里不适宜处理过多的方法,因为C#消息机制是消息流水线响应机制,

* 如果这里在主线程上处理语句的时间过长会导致主UI线程阻塞,

* 停止响应或响应不顺畅,这时你的主form界面会延迟或卡死      */

this.rtfTerminal.Text += Encoding.ASCII.GetString(readBuffer); ;

this.rtfTerminal.Focus();

//设置光标的位置到文本尾

this.rtfTerminal.Select(this.rtfTerminal.TextLength, 0);

//滚动到控件光标处

this.rtfTerminal.ScrollToCaret();

}

)

);

#endif

}

}

catch (Exception)

{

MessageBox.Show(this, e.ToString(), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);

}

finally // 放在finally里面比较好。

{

m_IsReceiving = false; // 关键!!!

}

m_Mutex.ReleaseMutex();

#else

int SDateTemp = this.serialPort1.ReadByte();//读取串口中一个字节的数据

this.rtfTerminal.Invoke(     //在拥有此控件的基础窗口句柄的线程上执行委托Invoke(Delegate)

//即在textBox_ReceiveDate控件的父窗口form中执行委托.

new MethodInvoker( //表示一个委托,该委托可执行托管代码中声明为 void 且不接

//受任何参数的任何方法。在对控件的 Invoke 方法进行调用时

//或需要一个简单委托又不想自己定义时可以使用该委托。

delegate

{   //匿名方法,C#2.0的新功能,这是一种允许程序员将一段完整

//代码区块当成参数传递的程序代码编写技术,通过此种方法可以直接使用委托来设计事件响应程序

//以下就是你要在主线程上实现的功能,但是有一点要注意,这里不适宜处理过多的方法,因为C#消息机

//制是消息流水线响应机制,如果这里在主线程上处理语句的时间过长会导致主UI线程阻塞,停止响应或响

//应不顺畅,这时你的主form界面会延迟或卡死

this.rtfTerminal.AppendText((Convert.ToChar(SDateTemp).ToString()));//输出到主窗口

//     文本控件

this.rtfTerminal.Text += "";

}

)

);

#endif

}

public void RefrespictureBox1()

{

if (serialPort1.IsOpen)

{

button1.BackColor = SystemColors.GradientActiveCaption;

button1.Text = "断开";

}

else

{

button1.BackColor = SystemColors.Control;

button1.Text = "连接";

}

}

/// <summary>

/// 结束工作

/// </summary>

public void DisconnectDeveice() // 关键和核心!!!

{

m_IsTryToClosePort = true;

while (m_IsReceiving)

{

System.Windows.Forms.Application.DoEvents();

}

serialPort1.Close();

m_IsTryToClosePort = false;

}

private void button1_Click(object sender, EventArgs e)

{

try

{

if (serialPort1.IsOpen)

{

this.serialPort1.DataReceived -= this.serialPort1_DataReceived;//先关掉对应的事件

DisconnectDeveice();

pictureBox1.Image = ComAssistant1.Properties.Resources.close;

}

else

{

this.serialPort1.DataReceived += this.serialPort1_DataReceived;

serialPort1.PortName = comboBox1.Text;

serialPort1.BaudRate = Convert.ToInt32(comboBox2.Text);

serialPort1.Open();

pictureBox1.Image = ComAssistant1.Properties.Resources.open;

}

RefrespictureBox1();

}

catch (Exception)

{

MessageBox.Show(this, e.ToString(), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

private void SendData_Click(object sender, EventArgs e)

{

if (AutoSend.Checked)

{

timer1.Enabled = true;

timer1.Interval = int.Parse(textEdit1.Text);

}

else

{

timer1.Enabled = false;

}

try

{

string s = "";

if (rbHex.Checked)

{

ArrayList al = MyClass.Str16ToArrayList(txtSend.Text);

byte[] by = new byte[al.Count];

int i = 0;

foreach (string stmp in al)

{

by[i] += Convert.ToByte(stmp, 16);

i++;

}

s = Encoding.GetEncoding("Gb2312").GetString(by);

}

else

{

s = txtSend.Text;

}

serialPort1.Write(s);

}

catch (Exception)

{

MessageBox.Show(this, e.ToString(), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)

{

rtfTerminal.Text = "";

}

private void checkBox2_CheckedChanged(object sender, EventArgs e)

{

}

private void timer1_Tick(object sender, EventArgs e)

{

SendData_Click(sender, e);

}

private void textEdit1_TextChanged(object sender, EventArgs e)

{

timer1.Interval = int.Parse(textEdit1.Text);

}

private void ComAssis_HelpButtonClicked(object sender, CancelEventArgs e)

{

if (MessageBox.Show("是否需要自动跳转到开发者网\r\nhttp://blog.csdn.net/jonnyqian",

"Help Message", MessageBoxButtons.OKCancel) == DialogResult.OK)

{

Process.Start("http://blog.csdn.net/jonnyqian");

}

}

}

}

时间: 2024-10-01 06:53:07

基于c#的工控软件版本v1.03_11.25(附源代码工程下载地址)最新版本的相关文章

基于c#的工控软件版本v1.01_11.25

最近打算用c#做点实事,原来一直都在用串口调试,打算开发一种结合securt的串口保存机制及传统调试助手的便携串口配置模式的软件.今天发出第一个版本,这段时间慢慢积累打算把这个软件网上起来. 今天解决了串口关闭问题,及串口接收16进制显示的问题. using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using Sy

多功能节点连线绘图控件Nevron Diagram for .NET使用方法及下载地址

Nevron Diagram for .NET是一个功能强大,世界上顶级的.NET图表控件.可扩展的图形报表构架,可以帮您创建功能丰富的Winforms及Webforms图表解决方案.这个产品构建于Nevron表述层框架之上,能为您提供令人激动的视觉冲击,您无法通过其它产品体验到 - 独一无二的商业图表应用程序.Nevron Diagram for .NET专门根据广泛的自定义需求而设计,它提供了高扩展性的对象模型,其API更加细化本地化及直观性.产品本身大量利用现代的设计模式,使其具有更高的可

【升级至sql 2012】sqlserver mdf向上兼容附加数据库(无法打开数据库 &#39;xxxxx&#39; 版本 611。请将该数据库升级为最新版本。)

sqlserver mdf向上兼容附加数据库(无法打开数据库 'xxxxx' 版本 611.请将该数据库升级为最新版本.) 最近工作中有一个sqlserver2005版本的mdf文件,还没有log文件,现在需要 附加到sqlserver2012,经过网上一顿搜索,把完整的过程奉上,供大家参考 首先创建数据库 再设置数据库的兼容性(经过尝试,此步骤可以省略) 停掉sqlserver 服务,将需要附件的mdf文件替换掉创建数据生成的mdf,删除掉对应的ldf文件 再启动sqlserver 服务 执行

Aspose Cells 控件如何实现数据过滤(附代码和下载地址)

Aspose Cells 是一款操作和处理以及转换Excel文件的类库,支持.NET和JAVA版,几乎所有Excel能实现的功能,Aspose Cells都可以实现,在Excel中经常会用到数据过滤,通过过滤规则,以达到想要显示的结果,一般过滤都是根据设置的条件,通常是文本.数字或者日期. Aspose Cells控件下载地址:http://www.componentcn.com/kongjianchanpin/yonghujiemian/biaogekongjian/2014-09-16/17

Opera官网打不开 下载Opera最新版本的实际地址

目前Opera官网可以打开,但是点下载时就会出错,国内无法访问Opera的下载地址,无法通过官网直接下载Opera浏览器.下面提供下载的方式. 一.通过官方的ftp站点下载 FTP地址为 http://ftp.opera.com/pub/opera/desktop/ 如图,选择合适的版本即可下载 虽然可以下载,不过下载速度有时候非常的慢,很坑爹. 二.通过快乐浏览站点下载 快乐浏览里定期更新主要浏览器的最新下载链接,通过此站点可以直接下载到最新的主流浏览器,当然包括Opera浏览器. 访问:快乐

工控软件项目和文档整理

C# 开源 scada (数据采集与监视控制系统) https://github.com/GavinYellow/SharpSCADA https://github.com/AlexDovgan/FreeSCADA 技术博客 https://blog.csdn.net/lweiyue/category_8016394.html https://www.cnblogs.com/evilcat/ https://www.mesta-automation.com https://www.cnblogs

优化IPOL网站中基于DCT(离散余弦变换)的图像去噪算法(附源代码)。

在您阅读本文前,先需要告诉你的是:即使是本文优化过的算法,DCT去噪的计算量依旧很大,请不要向这个算法提出实时运行的苛刻要求. 言归正传,在IPOL网站中有一篇基于DCT的图像去噪文章,具体的链接地址是:http://www.ipol.im/pub/art/2011/ys-dct/,IPOL网站的最大特点就是他的文章全部提供源代码,而且可以基于网页运行相关算法,得到结果.不过其里面的代码本身是重实现论文的过程,基本不考虑速度的优化,因此,都相当的慢. 这篇文章的原理也是非常简单的,整个过程就是进

如何知道exchange都有哪些版本跟现在用的exchange的版本号,最新版本是什么

如果查看自己的exchange的版本是哪个呢,方法有很多,一般打开exchange的管理控制台查看其它就行了,这里介绍一个更加方便的方法,就是在exchange的命令行工具下输入下面的命令: Get-ExchangeServer | Format-List Name, Edition, AdminDisplayVersion 得出的结果如下图: 现在exchange都有哪些版本呢? 关于这个,我们可以登录微软的官方网站查询,里面会定时更新资料, 其中会告诉我们有哪些版本,这些版本在什么时间更新过

开源完整版:《开源框架实战宝典电子书V1.0.0》内测版下载地址!

经过一个多月的整理,<J2EE开源框架实战宝典>--Tiny文档PDF电子书开始发放,共有将近600页,为喜爱Tiny.热爱Java开源框架的朋友提供更加体贴的文档服务! 下载地址:http://bbs.tinygroup.org/group-112-1.html(加入查看下载地址) 下面是部分目录的截图. 1.jpg (62.15 KB, 下载次数: 0) 下载附件 6 天前 上传 2.jpg (497.41 KB, 下载次数: 0) 下载附件 6 天前 上传 3.jpg (510.13 K