简介:微软的VS提供了SerialPort控件,也就是串行端口资源。

当然也可以添加引用 using System.IO.Ports;

通过实例化SerialPort对象就可以使用其属性和方法了。
SerialPort serialPort1 = new SerialPort();
最重要的几个属性:
serialPort1.Open();打开串行端口连接
serialPort1.Close();关闭串行端口连接
serialPort1.PortName 获取或设置通信端口(COM)

serialPort1.BaudRate 获取或设置串行波特率

serialPort1.DataBits 获取或设置每个字节的标准数据位长度
serialPort1.StopBits 获取或设置每个字节的标准停止位数
serialPort1.Parity 获取或设置奇偶校验检查协议
serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived); 数据接收事件的方法
 
简单的界面示例代码如下:
 
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.IO;
using System.Timers; namespace WinFromApp
{
public partial class Form1 : Form
{
private StreamReader sRead;
public int iTextbox2 = ;
SerialPort serialPort1 = new SerialPort();
public Form1()
{
InitializeComponent();
}
private DateTime _dt = DateTime.Now; //定义一个成员函数用于保存每次的时间点
private void textBox2_KeyPress(object sender, KeyPressEventArgs e)
{
DateTime tempDt = DateTime.Now; //保存按键按下时刻的时间点
TimeSpan ts = tempDt .Subtract(_dt); //获取时间间隔
if (ts.Milliseconds > ) //判断时间间隔,如果时间间隔大于50毫秒,则将TextBox清空
textBox2.Text = "";
_dt = tempDt ;
} private void timer1_Tick(object sender, EventArgs e)
{
string str1;
str1 = sRead.ReadLine();
if (str1 == null)
{
timer1.Stop();
sRead.Close();
MessageBox.Show("发送完毕","NICE");
button2.Enabled = true;
button3.Enabled = true;
button4.Enabled = true;
textBox1.Enabled = true;
textBox3.Enabled = true;
textBox4.Enabled = true;
return;
}
byte[] data = Encoding.Default.GetBytes(str1);
serialPort1.Write(data, , data.Length);
} private void Form1_Load(object sender, EventArgs e)
{
timer2.Start();
string[] str = SerialPort.GetPortNames();
if(str==null)
{
MessageBox.Show("本机没有串口!","Error");
return;
}
comboBox1.Items.AddRange(str);
comboBox1.SelectedIndex = ;
comboBox2.SelectedIndex = ;
comboBox4.SelectedIndex = ;
comboBox5.SelectedIndex = ;
this.toolStripStatusLabel1.Text = "端口号:端口未打开";
this.toolStripStatusLabel2.Text = "波特率:端口未打开";
this.toolStripStatusLabel3.Text = "数据位:端口未打开";
this.toolStripStatusLabel4.Text = "停止位:端口未打开";
int count = comboBox1.Items.Count;
//去除下拉框可选数据的重复项
int i;
for (i = ; i < count; i++)
{
string strs = comboBox1.Items[i].ToString();
for (int j = i + ; j < count; j++)
{
string str1 = comboBox1.Items[j].ToString();
if (str1 == strs)
{
comboBox1.Items.RemoveAt(j); count--; j--;
}
}
}
} //打开串口
private void button1_Click(object sender, EventArgs e)
{
String str1 = comboBox1.Text;
String str2 = comboBox2.Text;
String str3 = comboBox4.Text;
String str4 = comboBox5.Text;
Int32 int2 = Convert.ToInt32(str2);
Int32 int3 = Convert.ToInt32(str3);
try
{
if (str1 == null)
{
MessageBox.Show("请先选择串口!", "Error");
return;
}
serialPort1.PortName = str1;
serialPort1.BaudRate = int2;
serialPort1.DataBits = int3;
switch (comboBox5.Text)
{
case "":
serialPort1.StopBits = StopBits.One;
break;
case "1.5":
serialPort1.StopBits = StopBits.OnePointFive;
break;
case "":
serialPort1.StopBits = StopBits.Two;
break;
default:
MessageBox.Show("Error:参数不正确", "Error");
break;
}
if (serialPort1.IsOpen == true)
{
serialPort1.Close();
}
serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
serialPort1.Open();
MessageBox.Show("串口打开成功!",str1);
this.toolStripStatusLabel1.Text = "端口号:" + serialPort1.PortName + "";
this.toolStripStatusLabel2.Text="波特率:"+serialPort1.BaudRate+"";
this.toolStripStatusLabel3.Text = "数据位:" + serialPort1.DataBits + "";
this.toolStripStatusLabel4.Text = "停止位:" + serialPort1.StopBits + "";
button1.Enabled = false;
comboBox1.Enabled = false;
comboBox2.Enabled = false;
comboBox4.Enabled = false;
comboBox5.Enabled = false;
}
catch(Exception er)
{
MessageBox.Show("Error:"+er.Message,"Error");
return;
}
} //关闭串口
private void button2_Click(object sender, EventArgs e)
{
button1.Enabled = true;
comboBox1.Enabled = true;
comboBox2.Enabled = true;
comboBox4.Enabled = true;
comboBox5.Enabled = true;
serialPort1.Close();
this.toolStripStatusLabel1.Text = "端口号:" + serialPort1.PortName + "";
this.toolStripStatusLabel2.Text = "波特率:" + serialPort1.BaudRate + "";
this.toolStripStatusLabel3.Text = "数据位:" + serialPort1.DataBits + "";
this.toolStripStatusLabel4.Text = "停止位:" + serialPort1.StopBits + "";
} private void toolStripMenuItem3_Click(object sender, EventArgs e)
{
Application.Exit();
} //发送
private void button4_Click(object sender, EventArgs e)
{
if (button1.Enabled == true)
{
MessageBox.Show("请先打开串口","Error");
return;
}
String str1;
str1 = textBox1.Text;
byte[] data = Encoding.Default.GetBytes(str1);
if (checkBox1.Checked == true)
{
for (int i = ; i < data.Length; i++)
{
byte temp = data[i];
string tempHex = temp.ToString("X2") + "";
serialPort1.Write(tempHex);
}
}
else
{
serialPort1.Write(data,,data.Length);
}
}
//使用Control.Invoke
public delegate void DeleUpdateTextbox(string dateRe);
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string dataRe;
byte[] byteRead = new byte[serialPort1.BytesToRead];
DeleUpdateTextbox deleupdatetextbox = new DeleUpdateTextbox(UpdateTextbox);
serialPort1.Read(byteRead, , byteRead.Length);
if (checkBox2.Checked == false)
{
dataRe = Encoding.Default.GetString(byteRead);
textBox2.Invoke(deleupdatetextbox, dataRe);
}
else
{
for (int i = ; i < byteRead.Length; i++)
{
byte temp = byteRead[i];
dataRe = temp.ToString("X2") + "";
textBox2.Invoke(deleupdatetextbox, dataRe);
}
}
}
private void UpdateTextbox(string dataRe)
{
if (iTextbox2 == )
{
this.textBox2.Text = dataRe;
iTextbox2++;
}
else
{
textBox2.AppendText(dataRe);
}
}
//发送文件
private void button6_Click(object sender, EventArgs e)
{
string str3 = textBox3.Text;
if (button1.Enabled == true)
{
MessageBox.Show("请先打开串口", "Error");
return;
}
if (str3 == "")
{
MessageBox.Show("请选择要发送的文件!", "Error");
return;
}
string str1;
str1 = textBox4.Text;
timer1.Interval = Convert.ToInt32(str1);
timer1.Start();
button2.Enabled = false;
button3.Enabled = false;
button4.Enabled = false;
button5.Enabled = false;
textBox1.Enabled = false;
textBox3.Enabled = false;
textBox4.Enabled = false;
}
//选择文件
private void button8_Click(object sender, EventArgs e)
{
String filename;
openFileDialog1.FileName = "";
openFileDialog1.ShowDialog();
filename = openFileDialog1.FileName;
if(filename=="")
{
MessageBox.Show("请选择要发送的文件!","Error");
return;
}
textBox3.Text = filename;
if (filename != null)
{
sRead = new StreamReader(filename);
}
button5.Enabled = true;
}
//停止发送
private void button7_Click(object sender, EventArgs e)
{
timer1.Stop();
button2.Enabled = true;
button3.Enabled = true;
button4.Enabled = true;
textBox1.Enabled = true;
textBox3.Enabled = true;
textBox4.Enabled = true;
} private void textBox1_KeyDown(object sender, KeyEventArgs e)
{ if (e.KeyValue == )
{
if (button1.Enabled == true)
{
MessageBox.Show("请先打开串口!", "Error");
return;
}
String str1;
str1 = textBox1.Text;
byte[] data = Encoding.Default.GetBytes(str1);
serialPort1.Write(data, , data.Length);
textBox1.Clear();
}
return;
}
//发送文件清屏
private void button5_Click(object sender, EventArgs e)
{
textBox2.Clear();
iTextbox2 = ;
}
//发送字符清屏
private void button3_Click(object sender, EventArgs e)
{
textBox1.Clear();
iTextbox2 = ;
}
private void textBox2_TextChanged(object sender, EventArgs e)
{
if (textBox2.Text.Length > )
{
MessageBox.Show("条码长度:"+textBox2.Text.Length+"\n条码内容:"+textBox2.Text,"系统提示");
}
} private void timer2_Tick(object sender, EventArgs e)
{
string Week = DateTime.Now.DayOfWeek.ToString();
switch (Week)
{
case "Sunday":
Week = "星期天";
break;
case "Monday":
Week = "星期一";
break;
case "Tuesday":
Week = "星期二";
break;
case "Wednesday":
Week = "星期三";
break;
case "Thursday":
Week = "星期四";
break;
case "Friday":
Week = "星期五";
break;
case "Saturday":
Week = "星期六";
break;
}
label6.Text=DateTime.Now.ToString()+" "+Week;
}
}
}

 

C#的SerialPort串口程序设计总结的更多相关文章

  1. (c#2.0)serialPort串口通讯

    原文:(c#2.0)serialPort串口通讯 using System; using System.Collections.Generic; using System.ComponentModel ...

  2. SerialPort 串口开发

    private SerialPort sPort = new SerialPort(); //串行端口资源 /// <summary> /// 函数功能:打开串口/关闭串口 /// < ...

  3. winform SerialPort串口通信问题

    一.串口通信简介串行接口(串口)是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接受的串行数据流转换为并行的数据字符供给CPU的器件.一般完成这种功能的电路,我们称为串 ...

  4. System.IO.Ports.SerialPort串口通信接收完整数据

    C#中使用System.IO.Ports.SerialPort进行串口通信网上资料也很多,但都没有提及一些细节: 比如 串口有时候并不会一次性把你想要的数据全部传输给你,可能会分为1次,2次,3次分别 ...

  5. serialport串口通讯

    在.NET Framework 2.0中提供了SerialPort类,该类主要实现串口数据通信 = System.IO.Ports.SerialPort.GetPortNames();获取电脑有哪几个 ...

  6. java SerialPort串口通讯的使用

    api文档 http://fazecast.github.io/jSerialComm/javadoc/com/fazecast/jSerialComm/package-summary.html ma ...

  7. 【winform】serialPort 串口

    一. 1.串口通信简单实现 该来的总会来的,学做硬件的,串口这个东西必须得门清. 俗话说的好,不会做串口助手的电子工程师不是好程序员.

  8. [转]C# serialPort 串口接收中this.Invoke的使用

    本文转自:https://blog.csdn.net/hjk216/article/details/72677596 转载地址:http://www.ciast.net/post/20160752.h ...

  9. 基于FPGA具有容错能理的异步串口程序设计

    首先,问题源于一个项目.本来是一个很简单的多个串口收发FIFO存取数据的小程序,通过电脑验证也可用,而下位机板子之间通信就出现了丢数问题. 经过分析原因如下: 我的串口收模块是基于特权同学的开发板程序 ...

随机推荐

  1. bzoj2424

    比较简单的费用流,一目了然 ; type node=record next,point,flow,cost:longint; end; ..] of node; q:..] of longint; p ...

  2. JavaScript框架设计 第14章 动画引擎

    easing-js <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...

  3. 【转】Android开发中adb启动失败adb连接异常的解决办法 offline

    原文网址:http://www.cnblogs.com/yejiurui/p/4173521.html 一.情况描述: 我们在使用eclipse开发有时候会出现adb连接异常中,有时候控制台会打印出来 ...

  4. 网络流(最大流):COGS 28 [NOI2006] 最大获利

    28. [NOI2006] 最大获利 ★★★☆   输入文件:profit.in   输出文件:profit.out   简单对比 时间限制:2 s   内存限制:512 MB [问题描述] 新的技术 ...

  5. Count Complete Tree Nodes ——LeetCode

    Given a complete binary tree, count the number of nodes. Definition of a complete binary tree from W ...

  6. [转载]值得推荐的C/C++框架和库

    值得学习的C语言开源项目 C++ 资源大全 值得学习的C语言开源项目 1.Webbench Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我 ...

  7. servelt乱码问题(tomcat服务端编码为ISO-8859-1)

    Post的编码决定机制: <meta http-equiv="Content-Type" content="text/html; charset=gb2312&qu ...

  8. setState的同步更新

    react中的setState特点: 是异步操作函数: 组件在还没有渲染之前, this.setState 还没有被调用: 批量执行 State 转变时让 DOM 渲染更快(相对比一个一个的setSt ...

  9. WebChat 清爽来袭 -- JavaChat系统Ⅳ

    题记:          WebChat 依然搭配的是 JavaChat 服务器,在不修改原来服务器代码的情况下进行使用终端的扩展.         此次项目的难点在于,Action/Servlet ...

  10. 从零开始写一个Tomcat(叁)--请求解析

    挖坑挖了这么长时间也该继续填坑了,上文书讲到从零开始写一个Tomcat(贰)--建立动态服务器,讲了如何让服务器解析请求,分离servlet请求和静态资源请求,读取静态资源文件输出或是通过URLCla ...