C#串口通讯教程 简化一切 只保留核心功能 这可能是最易于理解的一篇教程
C#串口通讯教程 简化一切 只保留核心功能 这可能是最易于理解的一篇教程
串口的定义,请自行了解.
C#操作串口通讯在.Net强大类库的支持下,只需要三个步骤:
1 创建
2 打开
3 发送/接受
1 创建:
1 串口通讯需用用到的命名空间如下:
using System.IO.Ports; using System.IO;
2 因为全局使用,所以声明为全局变量
private SerialPort spSend = new SerialPort();
3 指定串口名称
spSend.PortName = "COM1"; //继续根据需要指定端口的波特率,校验位等信息 //在例子中我们只指定名称,其他的一概不管.
2 打开:
spSend.Open();
3 发送/接收
//发送
byte[] data = Encoding.ASCII.GetBytes("要发送的信息");
spSend.Write(data, 0, data.Length);
//接收 byte[] data = new byte[spSend.BytesToRead]; spSend.Read(data, 0, data.Length); String str = new ASCIIEncoding().GetString(data);//收取到的信息
好了,核心代码就是这么简单,下面看完整实例,
界面:

控件名称:
下拉框ComList 打开按钮btnOpen 发送框 txtSend 发送按钮btnSend 接收框txtInfo 另外还有一个定时器Timer1
完整源码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO.Ports;//需要的命名空间
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace ChengChenXu.com.COMDemo
{
public partial class Form1 : Form
{
private SerialPort spSend = new SerialPort(); //全局变量
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//获取本机串口列表
string[] comList = SerialPort.GetPortNames();
if (comList.Length == 0) MessageBox.Show("本机没有任何串口");
//绑定串口列表到下拉列表,设置第一项为默认值
foreach (var com in comList)
{
ComList.Items.Add(com);
}
ComList.SelectedIndex = 0;
//启动定时器,用来接受信息,没有使用多线程,更易于理解
timer1.Start();
}
private void btnOpen_Click(object sender, EventArgs e)
{
if (ComList.Items.Count == 0)
{
MessageBox.Show("没有发现串口");
return;
}
//判断是打开操作还是关闭操作
if (btnOpen.Text == "打开串口")
{
if (!spSend.IsOpen)
{
//设置端口名称
//这里我们仅仅设置端口的名称,其他的全部用默认.
spSend.PortName = ComList.SelectedItem.ToString();
try
{
//打开串口
spSend.Open();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
//更新控件状态
this.btnOpen.Text = "关闭串口";
this.ComList.Enabled = false;
}
}
else if(btnOpen.Text=="关闭串口")
{
//关闭串口
spSend.Close();
btnOpen.Text = "打开串口";
ComList.Enabled = true;
}
}
private void btnSend_Click(object sender, EventArgs e)
{
//发送数据
//准备数据 这里我们只实现发送ASCII码 其他的可以先转化为byte[]再发送
byte[] data = Encoding.ASCII.GetBytes(txtSend.Text);
if (spSend.IsOpen)
{
try
{
//发送动作 参数三个分别为数据 起始偏移位置 长度
spSend.Write(data, 0, data.Length);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
else
{
MessageBox.Show("端口还未打开");
}
}
private void Receive()
{
//接收信息 先判断是否为打开状态
if (spSend.IsOpen)
{
//准备接收
byte[] data = new byte[spSend.BytesToRead];
//接受动作
spSend.Read(data, 0, data.Length);
//把接收到的信息转成字符串显示到控件里
this.txtInfo.Text += new ASCIIEncoding().GetString(data);
}
}
private void timer1_Tick(object sender, EventArgs e)
{
//用定时器来定期执行接收动作 间隔100毫秒
Receive();
}
}
}

如何测试
串口通讯既然是通讯那么肯定是需要两方参与的,如何在单机进行测试呢?下面给出几个方法:
1 方法一 把电脑串口的2 3针链接起来,那么接收方和发送方可以为同一个端口.因为2针负责发送,3针负责接收,连接起来即可形成回路
2 使用两台电脑,用串口线相连
3 使用虚拟串口软件,最简单易用,这里我们采用这个方法进行测试.
首先软件下载:VirtualSerialPortDriver 下载地址:
VirtualSerialPortDriver.rar
这个是一个收费软件,半个月的试用期,需要的话可以搜索下是否有破解版
安装好之后打开软件,右侧选择好两个准备互联的串口然后点击Add pair即可. 我选择的是COM9和COM10 可以看到左边Virtual ports下面已经有了COM9和COM10了 他们已经可以实现通讯了

把DEMO编译好之后,直接运行两个实例: 一个选择COM9 一个选择COM10 然后都打开串口

现在已经可以互相发送信息了
由COM9发出的Send for COM9已经发送到COM10
COM9也已经接收到了COM10发出的信息Send for COM10

本例只用了最简单的例子来演示串口通讯过程,简化一切功能,只为更好理解.
源码以及DEMO:
ChengChenXu.com.COMDemo.rar
本文为博主原创,转载请保留出处:
http://www.chengchenxu.com/Article/27/netchuankou
C#串口通讯教程 简化一切 只保留核心功能 这可能是最易于理解的一篇教程的更多相关文章
- 利用PDF.JS插件解决了本地pdf文件在线浏览问题(根据需要隐藏下载功能,只保留打印功能)
我是在IE11和谷歌上做的测试,都可以显示,把做出的东西记录下来,方便大家还有自己学习! 可以在IIS7服务器上也可以下载Tomcat来做服务器 Tomcat下载地址 http://pan.bai ...
- 第20章 USART—串口通讯—零死角玩转STM32-F429系列
第20章 USART—串口通讯 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fi ...
- 第20章 USART—串口通讯
本章参考资料:<STM32F76xxx参考手册>USART章节. 学习本章时,配合<STM32F76xxx参考手册>USART章节一起阅读,效果会更佳,特别是涉及到寄存器说明的 ...
- C#中的WinFrom技术实现串口通讯助手(附源码)
C#中的WinFrom技术实现串口通讯助手(附源码) 实现的功能: 1.实现自动加载可用串口. 2.打开串口,并且使用C#状态栏显示串口的状态. 3.实现了串口的接收数据和发送数据功能. 4.串口 ...
- 教程-Delphi MSComm 实时串口通讯
Delphi MSComm 实时串口通讯 MSComm控件具有丰富的与串口通信密切相关的属性,提供了对串口进行的多种操作,进而使串行通信变得十分简便.MSComm的控件属性较多,常用的属性如下:1) ...
- 西门子plc串口通讯方式
西门子plc串口通讯的三种方式 时间:2015-10-25 14:31:55编辑:电工栏目:西门子plc 导读:西门子plc串口通讯的三种方式,分为RS485 串口通信.PPI 通信.MPI 通信,自 ...
- STM32F10x 学习笔记5(USART实现串口通讯 1)
STM32F10x 系列单片机中都包含了USART 模块,所谓USART,就是通用同步异步收发器.通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间 ...
- C#串口通讯概念以及简单实现
最近在研究串口通讯,其中有几个比较重要的概念,RS-232这种适配于上位机和PC端进行连接,RS-232只限于PC串口和设备间点对点的通信.它很简单的就可以进行连接,由于串口通讯是异步的,也就是说你可 ...
- Android串口通讯
今天在整一个项目,需要利用串口通讯在网上看了好多人的帖子才稍微整出了一点头绪. 首先串口代码就是利用谷歌自己的api,将java代码放在java/android_serialport_api目录下,如 ...
随机推荐
- Maven运行报错:-Dmaven.multiModuleProjectDirectory system propery is not set.
eclipse中使用maven插件的时候,运行run as maven build的时候报错 -Dmaven.multiModuleProjectDirectory system propery is ...
- BZOJ 2508: 简单题
题目大意: 加入直线,删除直线,求点到所有直线的距离的平方和. 题解: 把点到直线的距离公式写出来,然后展开.维护六个值,计算一个二元的多项式的最小值. 对x和y分别求导,导数都为零时取到极值.然后解 ...
- Hive 执行查询语句报错,由于内存空间不足导致
org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.server.namenode.SafeModeException): Can ...
- visionPro工业视觉工具中英文一览表
- 使用 RMAN 同步数据库
使用 RMAN同步数据库 使用 RMAN 同步数据库 一.概述 二 操作步骤 (一).把生产库置为归档模式 (二).启动rman做数据库0级备份 (三).修改生产库数据库到未归档 (四).拷贝备份集到 ...
- Android开发调试无法连接到夜神模拟器的解决方法
Android开发调试无法连接到夜神模拟器的解决方法: 一般原因是adb的版本不一致造成的!!!!!换成一样的就可以了. 在网上看到的方法,特记录下来: 1.任务管理器里看下,adb.exe以及nox ...
- .NET重构(五):存储过程、触发器和函数的区别
导读:在触发器的学习过程中,师傅讲了它的耦合性高,建议我能用存储过程,那到底什么是存储过程呢,自己也不是特别了解,还有就是,触发器也算是一种特殊的存储过程,为什么就不建议多用呢?接下来,就谈谈触发器. ...
- TCP内核参数
tcp_syn_retries :INTEGER默认值是5对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃.不应该大于255,默认值是5,对应于180秒左右时间.(对于大负载而物理通信良 ...
- 常州模拟赛d4t3 字符串划分
题目描述 给你一串由小写字母组成的字符串,希望你把它划分成一些小段,使得每一小段字符串中的字母 都不相同,并且希望分的段数尽量少. 然后,把这些小段按字典序排序后输出,中间由一个空格分隔. 例如:字符 ...
- 关于时区、时间戳引起的bug理解
时间戳定义:0时区1970年1月1日到现在的毫秒数,所以全世界同一时刻的时间戳都是一样的. 北京时间对应时间戳=unix(0时区对应时间的时间戳)-8*60*60*1000(8小时的毫秒数)----- ...