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

最近打算用c#做点实事,原来一直都在用串口调试,打算开发一种结合securt的串口保存机制及传统调试助手的便携串口配置模式的软件。今天发出第一个版本,这段时间慢慢积累打算把这个软件网上起来。

今天解决了串口关闭问题,及串口接收16进制显示的问题。

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;

namespace ComAssistant1

{

public partial class Form1 : 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 Form1()

{

InitializeComponent();

}

Mutex m_Mutex = null;//锁

bool flag;

private void Form1_Load(object sender, EventArgs e)

{

//判断串口打开或关闭

if (serialPort1.IsOpen)

{

serialPort1.Close();

pictureBox1.Image = Image.FromFile("E:\\C#\\图标\\PNG\\20091007130906335.png");

}

else

{

pictureBox1.Image = Image.FromFile("E:\\C#\\图标\\PNG\\20091007130902885.png");

}

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)

{

//     m_Mutex.WaitOne();

{

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

}

DisconnectDeveice();

//       flag = true;

//     m_Mutex.ReleaseMutex();

pictureBox1.Image = Image.FromFile("E:\\C#\\图标\\PNG\\20091007130902885.png");

}

else

{

this.serialPort1.DataReceived += this.serialPort1_DataReceived;

serialPort1.PortName = comboBox1.Text;

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

//  serialPort1.Parity = (Parity)Enum.Parse(typeof(Parity), comboBox3.Text);

// serialPort1.DataBits = Int32.Parse(comboBox4.Text);

// serialPort1.StopBits = (StopBits)Enum.Parse(typeof(StopBits), comboBox5.Text);

//   serialPort1.Encoding = Encoding.GetEncoding("Gb2312");

serialPort1.Open();

pictureBox1.Image = Image.FromFile("E:\\C#\\图标\\PNG\\20091007130906335.png");

//    this.flag = false;

}

RefrespictureBox1();

}

catch (Exception)

{

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

}

}

private void checkEdit1_CheckedChanged(object sender, EventArgs e)

{

}

private void button2_Click(object sender, EventArgs e)

{

//  serialPort1.WriteLine(txtSend.Text);

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);

//    Log(LogMsgType.Incoming, s);

}

else

{

s = txtSend.Text;

}

if (AutoSend.Checked)

{

for (int i = 0; i < 5; i++)

{

System.Threading.Thread.Sleep(5000);

serialPort1.Write(s);

}

}

else

{

serialPort1.Write(s);

//   Log(LogMsgType.Outgoing, s);

}

}

catch (Exception)

{

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

}

}

private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)

{

rtfTerminal.Text = "";

}

}

}

时间: 2024-10-09 15:05:17

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

基于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.Drawin

工控软件项目和文档整理

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

两款工控控件对比评测:Iocomp和ProEssentials

对于程序员来说,要凭一己之力开发出漂亮逼真的工控仪表和工控图表是非常耗时间和精力的,那么使用专业的第三方控件就是不错的选择,不仅节约开发时间,降低了项目风险,最重要的是第三方控件写的程序更专业,工控图表图像更精细.笔者认为最好用的工控控件当属 Iocomp 和 ProEssentials.下面笔者对这两个工控控件进行了简单的对比评测: Iocomp工控仪表 Iocomp公司可以说是工业仪表盘控件的龙头老大,在国内工业自动化集成商中,尤其是OPC项目,采用Iocomp产品进行仪表设计的项目越来越多

上海工业控制-青岛海天炜业InTrust可信芯片工控安全平台系统软件

工业控制-青岛海天炜业InTrust可信芯片工控安全平台系统软件 鉴于工业控制系统应用场景的特殊性,通用杀毒软件无法有效对各控制系统(DCS/SCADA/PLC/SIS等)的操作站.工程师站等终端的工控软件进程进行有效识别和查杀,难以采用传统的安全产品进行防护. “InTrust可信芯片工控安全平台”是海天炜业联合中科院软件所合作研发推出的基于自主可信计算技术的产品,该产品采用我国自主知识产权的TCM硬件芯片,对工控软件进程进行可信度量并对度量信息进行加密运算. InTrust工控可信计算安全产

工控领域组态软件开发感触

从2001年进入工控领域以来,前后7年多的时间开发了诸如二型计量监控系统.焦炉四大机车自动化系统.烧结配水监控系统.隧道广告影像系统.通用组态软件.嵌入式系统组态软件(基于WINCE系统).LED视频影像系统和ICU病室输液管理等系统.其中焦炉四大机车自动化系统获得了国家专利,而隧道广告影像系统目前发展势头良好,在北京地铁(2号线.4号线),深圳地铁(罗宝线)都已实施安装,未来上海和国外也将安装该系统. 开发这些系统最大的感触就是,初次开发相对比较容易,但是后续系统扩展,维护相对较难,在系统架构

基于HTML5的Web SCADA工控移动应用

在电力.油田燃气.供水管网等工业自动化领域Web SCADA的概念已经提出了多年,早先年的Web SCADA前端技术大部分还是基于Flex.Silverlight甚至Applet这样的重客户端方案,在HTML5流行前VML和SVG算是真正纯种Web方案也是有不少应用,近些年随着HTML5的流行,加上移动终端对HTML5支持的普及,越来越多新项目开始采用真正纯HTML5的方案,更具体的说大数据量应用性能高于SVG的Canvas方案,已经逐渐成为当今Web SCADA前端技术的首选标配方案. htt

基于HT for Web的Web SCADA工控移动应用

在电力.油田燃气.供水管网等工业自动化领域Web SCADA的概念已经提出了多年,早先年的Web SCADA前端技术大部分还是基于Flex.Silverlight甚至Applet这样的重客户端方案,在HTML5流行前VML和SVG算是真正纯种Web方案也是有不少应用,近些年随着HTML5的流行,加上移动终端对HTML5支持的普及,越来越多新项目开始采用真正纯HTML5的方案,更具体的说大数据量应用性能高于SVG的Canvas方案,已经逐渐成为当今Web SCADA前端技术的首选标配方案. 最近客

工控安全入门之Modbus(转载)

工控安全这个领域比较封闭,公开的资料很少.我在读<Hacking Exposed Industrial Control Systems>,一本16年的书,选了的部分章节进行翻译,以其抛砖引玉. MODBUS Modbus是20世纪70年代后期由Modicon(现为施耐德电气)为了配合其可编程逻辑控制器(PLC)一起使用,创建的基于串行的控制协议.Modbus是最常见的工业控制协议,主要是因为Modbus是一种开放的简单而强大的协议,可以在没有任何版税的情况下开放使用.自从引入Modbus以来,

工控系统的指纹识别技术

转载:灯塔实验室 当前,指纹识别技术已被或坏或好的广泛应用于ICT(信息和通信技术)系统.攻击者通过扫描网络获取设备指纹来关联漏洞入侵系统,安全防护者则利用设备指纹来发现系统的脆弱性,检测系统的网络异常.在工业控制系统(ICS)中,指纹识别技术亦用于发现ICS系统脆弱性,检测攻击行为等方向.本文主要关注工控安全领域指纹识别技术. 指纹识别是什么 在ICT领域里,指纹识别是利用不同信息描述运行于网络中的设备或者软件的一种技术.我们了解最多的是设备指纹,被用来远程识别设备的硬件,操作系统,运行软件(