VS上利用C#实现一个简单的串口程序记录
本篇就C#实现一个简单的串口程序做个简单记录
一、背景
工作上需要利用串口往下位机写入数据,VC太老,正好借此机会来熟悉一直很想接触的VS之C#。
感谢Tony托尼哥的串口通信代码,感谢梦真的C#的技术支持。
二、正文
1、项目架构:(以我现有的知识认知来说)
一共有3个文件:
a、”Program.cs”保存的是主程序入口。
b、”Form1.Designer.cs”图形控件的实现。
c、”Form1.cs”里面实现的既是用户逻辑。
典型代码结构如下:
最先运行文件"Program.cs"内的主程序 namespace TB528E4PSE_APP { static class Program { /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new VOUTCTRL());-----------------------| } | } | } | 然后接着运行"Form1.cs" 文件内的"VOUTCTRL()". | namespace TB528E4PSE_APP | { | public partial class VOUTCTRL : Form | { | SerialPort serialPort; | | public VOUTCTRL() <---------------------------------------| { //IntializeComponent()函数在"Form1.Designer.cs"里实现,
//功能是初始化图形界面 //在图形界面操作时,该代码会被VS自动更改 InitializeComponent(); Control.CheckForIllegalCrossThreadCalls = false; //获取串口 String[] serialPortArray = SerialPort.GetPortNames(); if (serialPortArray != null && serialPortArray.Length != 0) { //对串口进行排序 Array.Sort<String>(serialPortArray); foreach (String port in serialPortArray) { //添加到combox的item if (port != null && port.Length != 0) comboBox_SPort.Items.Add(port); } } //设置初始显示的值 comboBox_SPort.SelectedIndex = 0; serialPort = new SerialPort(); } private void button_SPort_Click(object sender, EventArgs e) { // 在图形界面编辑时,双击Button控件,该函数由VS自动生成 // 打开窗口 if (button_SPort.Text == "Open") { if (serialPort.IsOpen) serialPort.Close(); try { setPort(); serialPort.Open(); button_SPort.Text = "Close"; } catch (Exception ex) { MessageBox.Show("Uable to open this serial port!\n"); } } else { button_SPort.Text = "Open"; serialPort.Close(); } } private void trackBar_VOUT1_Scroll(object sender, EventArgs e) { // 在图形界面编辑时,双击trackBar类控件,该函数由VS自动生成 // 拖动trackBar_VOUT1控件实现的逻辑 /* 一些代码逻辑,就不详细贴了。 ... setSerialVOUT(_Channel_1, _LV0); ... */ } private void trackBar_VOUT2_Scroll(object sender, EventArgs e) { // 在图形界面编辑时,双击trackBar类控件,该函数由VS自动生成 // 拖动trackBar_VOUT2控件实现的逻辑 /* 一些代码逻辑,就不详细贴了。 ... setSerialVOUT(_Channel_2, _LV0); ... */ } private void setPort() // 初始化串口 { try { serialPort.PortName = (String)(comboBox_SPort.SelectedItem); serialPort.BaudRate = 115200; serialPort.DataBits = 8; serialPort.StopBits = StopBits.One; serialPort.Parity = Parity.None; } catch (Exception ex) { Console.WriteLine(ex); } } private void setSerialVOUT(byte channel, byte level) { byte[] buf = new byte[3]; // C#创建数组的方法 buf[0] = channel; buf[1] = level; buf[2] = (byte)\'0\'; if (serialPort != null && serialPort.IsOpen) { serialPort.Write(buf,0,3); // 向串口写入数据 } } } } 文件"Form1.Designer.cs"里包含的函数"InitializeComponent();" namespace TB528E4PSE_APP { partial class VOUTCTRL { /// <summary> /// 必需的设计器变量。 /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// 清理所有正在使用的资源。 /// </summary> /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows 窗体设计器生成的代码 /// <summary> /// 设计器支持所需的方法 - 不要 /// 使用代码编辑器修改此方法的内容。 /// </summary> private void InitializeComponent() { System.ComponentModel.ComponentResourceManager resources = \
new System.ComponentModel.ComponentResourceManager(typeof(VOUTCTRL)); this.trackBar_VOUT2 = new System.Windows.Forms.TrackBar(); this.trackBar_VOUT1 = new System.Windows.Forms.TrackBar(); this.groupBox1 = new System.Windows.Forms.GroupBox(); this.label1 = new System.Windows.Forms.Label(); this.textBox_VOUT1 = new System.Windows.Forms.TextBox(); this.groupBox2 = new System.Windows.Forms.GroupBox(); this.label2 = new System.Windows.Forms.Label(); this.textBox_VOUT2 = new System.Windows.Forms.TextBox(); this.comboBox_SPort = new System.Windows.Forms.ComboBox(); this.label3 = new System.Windows.Forms.Label(); this.button_SPort = new System.Windows.Forms.Button(); ((System.ComponentModel.ISupportInitialize)\
(this.trackBar_VOUT2)).BeginInit(); ((System.ComponentModel.ISupportInitialize)\
(this.trackBar_VOUT1)).BeginInit(); this.groupBox1.SuspendLayout(); this.groupBox2.SuspendLayout(); this.SuspendLayout(); // // trackBar_VOUT2 // this.trackBar_VOUT2.LargeChange = 1; this.trackBar_VOUT2.Location = new System.Drawing.Point(0, 60); this.trackBar_VOUT2.Maximum = 11; this.trackBar_VOUT2.Name = "trackBar_VOUT2"; this.trackBar_VOUT2.Size = new System.Drawing.Size(400, 56); this.trackBar_VOUT2.TabIndex = 0; this.trackBar_VOUT2.Scroll += new \
System.EventHandler(this.trackBar_VOUT2_Scroll); // // trackBar_VOUT1 // this.trackBar_VOUT1.BackColor = System.Drawing.SystemColors.Control; this.trackBar_VOUT1.LargeChange = 1; this.trackBar_VOUT1.Location = new System.Drawing.Point(0, 60); this.trackBar_VOUT1.Maximum = 11; this.trackBar_VOUT1.Name = "trackBar_VOUT1"; this.trackBar_VOUT1.Size = new System.Drawing.Size(400, 56); this.trackBar_VOUT1.TabIndex = 1; this.trackBar_VOUT1.Scroll += new \
System.EventHandler(this.trackBar_VOUT1_Scroll); // // groupBox1 // this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)\
((System.Windows.Forms.AnchorStyles.Bottom | \
System.Windows.Forms.AnchorStyles.Left))); this.groupBox1.Controls.Add(this.label1); this.groupBox1.Controls.Add(this.textBox_VOUT1); this.groupBox1.Controls.Add(this.trackBar_VOUT1); this.groupBox1.Location = new System.Drawing.Point(27, 81); this.groupBox1.Name = "groupBox1"; this.groupBox1.Size = new System.Drawing.Size(400, 116); this.groupBox1.TabIndex = 2; this.groupBox1.TabStop = false; this.groupBox1.Text = "VOUT1"; // // label1 // this.label1.AutoSize = true; this.label1.Location = new System.Drawing.Point(23, 31); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(47, 15); this.label1.TabIndex = 3; this.label1.Text = "LEVEL"; // // textBox_VOUT1 // this.textBox_VOUT1.Location = new System.Drawing.Point(142, 28); this.textBox_VOUT1.Name = "textBox_VOUT1"; this.textBox_VOUT1.ReadOnly = true; this.textBox_VOUT1.Size = new System.Drawing.Size(121, 25); this.textBox_VOUT1.TabIndex = 2; this.textBox_VOUT1.Text = "LV 0"; // // groupBox2 // this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)\
((System.Windows.Forms.AnchorStyles.Bottom | \
System.Windows.Forms.AnchorStyles.Left))); this.groupBox2.Controls.Add(this.label2); this.groupBox2.Controls.Add(this.textBox_VOUT2); this.groupBox2.Controls.Add(this.trackBar_VOUT2); this.groupBox2.Location = new System.Drawing.Point(27, 215); this.groupBox2.Name = "groupBox2"; this.groupBox2.Size = new System.Drawing.Size(400, 116); this.groupBox2.TabIndex = 3; this.groupBox2.TabStop = false; this.groupBox2.Text = "VOUT2"; // // label2 // this.label2.AutoSize = true; this.label2.Location = new System.Drawing.Point(23, 32); this.label2.Name = "label2"; this.label2.Size = new System.Drawing.Size(47, 15); this.label2.TabIndex = 5; this.label2.Text = "LEVEL"; // // textBox_VOUT2 // this.textBox_VOUT2.Location = new System.Drawing.Point(142, 29); this.textBox_VOUT2.Name = "textBox_VOUT2"; this.textBox_VOUT2.ReadOnly = true; this.textBox_VOUT2.Size = new System.Drawing.Size(121, 25); this.textBox_VOUT2.TabIndex = 4; this.textBox_VOUT2.Text = "LV 0"; // // comboBox_SPort // this.comboBox_SPort.FormattingEnabled = true; this.comboBox_SPort.Location = new System.Drawing.Point(169, 34); this.comboBox_SPort.Name = "comboBox_SPort"; this.comboBox_SPort.Size = new System.Drawing.Size(121, 23); this.comboBox_SPort.TabIndex = 4; // // label3 // this.label3.AutoSize = true; this.label3.Location = new System.Drawing.Point(24, 37); this.label3.Name = "label3"; this.label3.Size = new System.Drawing.Size(87, 15); this.label3.TabIndex = 5; this.label3.Text = "SerialPort"; // // button_SPort // this.button_SPort.Location = new \
System.Drawing.Point(329, 33); this.button_SPort.Name = "button_SPort"; this.button_SPort.Size = new \
System.Drawing.Size(75, 23); this.button_SPort.TabIndex = 6; this.button_SPort.Text = "Open"; this.button_SPort.UseVisualStyleBackColor = true; this.button_SPort.Click += new \
System.EventHandler(this.button_SPort_Click); // // VOUTCTRL // this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(449, 384); this.Controls.Add(this.button_SPort); this.Controls.Add(this.label3); this.Controls.Add(this.comboBox_SPort); this.Controls.Add(this.groupBox1); this.Controls.Add(this.groupBox2); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Name = "VOUTCTRL"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "TB528E4PSE"; ((System.ComponentModel.ISupportInitialize)(this.trackBar_VOUT2)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.trackBar_VOUT1)).EndInit(); this.groupBox1.ResumeLayout(false); this.groupBox1.PerformLayout(); this.groupBox2.ResumeLayout(false); this.groupBox2.PerformLayout(); this.ResumeLayout(false); this.PerformLayout(); } #endregion private System.Windows.Forms.TrackBar trackBar_VOUT2; private System.Windows.Forms.TrackBar trackBar_VOUT1; private System.Windows.Forms.GroupBox groupBox1; private System.Windows.Forms.GroupBox groupBox2; private System.Windows.Forms.Label label1; private System.Windows.Forms.TextBox textBox_VOUT1; private System.Windows.Forms.Label label2; private System.Windows.Forms.TextBox textBox_VOUT2; private System.Windows.Forms.ComboBox comboBox_SPort; private System.Windows.Forms.Label label3; private System.Windows.Forms.Button button_SPort; } }
至此,代码跟踪至此。
2、更改窗体在屏幕首次出现的位置
即当APP运行时,窗体会在电脑屏幕的哪个位置弹出。点击窗体->属性,
找到“startposition”,如下图:
注意以上图片包含的信息:Text选项,此处则可以表明窗体显示的信息。
3,更改窗体显示的图标。
即当APP运行时,窗体在Text旁边的图片,点击窗体->属性,
找到“Icon”,如下图:
4、如何发布程序:
点击项目栏“生成”,点击“发布”选项即可发布程序了,如下图:
生成的文件如下图:
点击后缀名为”.application”即可实现安装。
5、发布安装后,程序在桌面显示的图标,以及支持的”.NET frameworkXX.XX”设置。
在项目右击,选择属性,会跳出窗体”项目名.csproj”文件,
里面可进行相应设置,如下图:
三、参考链接
Tony被参考的源代码github地址:
https://github.com/TonySudo/SerialPortW
至此,记录完毕
记录时间:2016-8-26
记录地点:深圳WZ