C#初入串口通信(串行通信)总结
使用WinFrom来实现:
首先要知道串口通信协议以及原理
原理大概提一下:要自己翻阅看。(http://book.51cto.com/art/200911/162532.htm或者http://hi.baidu.com/fly514/item/54aeb9d731ddedb932db9006)
代码部分:
实现串口通信有很多种办法,有COM组件(收费),有.net的serialPort串行端口控件等等,这里实现的方法是使用.NET提供的一个很方便的类:SerialPort。(这个类中一般简单的功能都可以实现,如果要实现的功能很变态的话,就另请高明吧)
实现的功能很简单(就是发送数据和接收数据而已),这是我初学者的入门总结。
首先,先将这些下拉空的值手动添加进去(第一个串行端口是程序实现的,也可以手动添加COM1等等)
停止位:One OnePointFive Two
数据位:8 7 6
校验位:Even Mark None Odd Space
波特率:300 600 1200 2400 4800 9600 19200 38400 43000 56000 57600 115200
(还有其他数字的波特率,看实际情况而定了,这应该是常用的波特率了)
这个类是在using System.IO.Ports命名空间下的类。
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;
namespace MyComm
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
//如果不写,当你接收数据并且把数据显示到文本框上的时候会直接报错的。
//因为这是对 Windows 窗体控件进行线程安全调用
//访问 Windows 窗体控件本质上不是线程安全的。
//如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态。
//还可能出现其他与线程相关的 bug,包括争用情况和死锁。确保以线程安全方式访问控件非常重要。
//.NET Framework 有助于在以非线程安全方式访问控件时检测到这一问题。
//在调试器中运行应用程序时,如果创建某控件的线程之外的其他线程试图调用该控件,
//则调试器会引发一个 InvalidOperationException,并提示消息:“从不是创建控件 control name 的线程访问它。”
Form.CheckForIllegalCrossThreadCalls = false;
}
//定义SerialPort类
SerialPort Myport = null;
///
/// 窗体加载完成触发
///
///
///
private void Form2_Load(object sender, EventArgs e)
{
//实例化
Myport = new SerialPort();
//这里需要添加引用Microsoft.VisualBasic的引用,提供操作计算机组件(如:音频,时钟,键盘文件系统等)的属性
Microsoft.VisualBasic.Devices.Computer pc = new Microsoft.VisualBasic.Devices.Computer();
//循环该计算机上所有串行端口的集合
foreach (string s in pc.Ports.SerialPortNames)
{
//串口名称添加到cbxPortName下拉框上
//一般计算机上是有COM1和COM2串口的,如果没有自己在cbxPortName下拉框里写COM1 和 COM2的字符串(如:this.cbxPortName.Items.Add("COM2"))
this.cbxPortName.Items.Add(s);
}
//防止报错,万一计算机上没有串口,就不走这一步
if (pc.Ports.SerialPortNames.Count > 0)
{
cbxPortName.SelectedIndex = 0;
}
cmbbaud.SelectedIndex = 0;
cmbParity.SelectedIndex = 0;
cmbBits.SelectedIndex = 0;
cmbStop.SelectedIndex = 0;
}
///
/// 打开串口按钮
///
///
///
private void btnOpen_Click(object sender, EventArgs e)
{
//设置串口端口
Myport.PortName = cbxPortName.Text;
//设置比特率
Myport.BaudRate = Convert.ToInt32(cmbbaud.Text);
//设置数据位
Myport.DataBits = Convert.ToInt32(cmbBits.Text);
//根据选择的数据,设置停止位
//if (cmbStop.SelectedIndex == 0)
// Myport.StopBits = StopBits.None;
if (cmbStop.SelectedIndex == 1)
Myport.StopBits = StopBits.One;
if (cmbStop.SelectedIndex == 2)
Myport.StopBits = StopBits.OnePointFive;
if (cmbStop.SelectedIndex == 3)
Myport.StopBits = StopBits.Two;
//根据选择的数据,设置奇偶校验位
if (cmbParity.SelectedIndex == 0)
Myport.Parity = Parity.Even;
if (cmbParity.SelectedIndex == 1)
Myport.Parity = Parity.Mark;
if (cmbParity.SelectedIndex == 2)
Myport.Parity = Parity.None;
if (cmbParity.SelectedIndex == 3)
Myport.Parity = Parity.Odd;
if (cmbParity.SelectedIndex == 4)
Myport.Parity = Parity.Space;
//此委托应该是异步获取数据的触发事件,即是:当有串口有数据传过来时触发
Myport.DataReceived += new SerialDataReceivedEventHandler(port1_DataReceived);//DataReceived事件委托
//打开串口的方法
try
{
Myport.Open();
if (Myport.IsOpen)
{
MessageBox.Show("the port is opened!");
}
else
{
MessageBox.Show("failure to open the port!");
}
}
catch (Exception ex)
{
MessageBox.Show("failure to open the port!"+ex.ToString());
}
}
///
/// 关闭串口的方法
///
public void ClosePort()
{
Myport.Close();
if (!Myport.IsOpen)
{
Console.WriteLine("the port is already closed!");
}
}
///
/// 发送按钮
///
///
///
private void btnNotAutoSend_Click(object sender, EventArgs e)
{
//向串口发送数据的方法
SendCommand(txtSend.Text.Trim());
}
///
/// 向串口发送数据的方法
///
///
public void SendCommand(string CommandString)
{
//转换
//串口只能读取ASCII码或者进制数(1,2,3.....的进制,一般是16进制)
byte[] WriteBuffer = Encoding.ASCII.GetBytes(CommandString);
//将数据缓冲区的数据写入到串口端口
Myport.Write(WriteBuffer, 0, WriteBuffer.Length);
}
///
/// DataReceived事件委托的方法
///
///
///
private void port1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
string currentline = "";
//循环接收串口中的数据
while (Myport.BytesToRead > 0)
{
char ch = (char)Myport.ReadByte();
currentline += ch.ToString();
}
//在这里对接收到的数据进行显示
//如果不在窗体加载的事件里写上:Form.CheckForIllegalCrossThreadCalls = false; 就会报错)
this.txtReceive.Text = currentline;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message.ToString());
}
}
}
}
配合上“VSPM虚拟串口”用就很方便 :(根据http://blog.csdn.net/redhaste/article/details/4097863和http://blog.csdn.net/gaojing007/article/details/5399503写的文章)
附件下载(VSPM虚拟串口,C#中串口通信编程.doc,SerialPort程序例子):
http://yunpan.cn/Q7Yi7geX988MY 提取码 167e
在编程的过程中用到了几个工具:串口助手,VSPM虚拟串口,Configure Virtual Serial Port Driver。
C#初入串口通信(串行通信)总结的更多相关文章
- Linux与Windows串口通信
串口是常用的计算机与外部串行设备之间的数据传输通道,由于串行通信方便易行,所以应用广泛.现在国际上不断有串口新技术及新规格推出,结合社会各方面需要,串口通信发展的空间庞大.串口通讯技术因其自身的优势和 ...
- 串口通信-MSComm控件使用详解
串口通信-MSComm控件使用详解 2012年11月13日 09:35:45 他山之石可以攻玉 阅读数:37952更多 个人分类: 控件编程Delphi编程 MSComm 控件通过串行端口传输和接 ...
- .NET 串口通信
这段时间做了一个和硬件设备通信的小项目,涉及到扫描头.输送线.称重机.贴标机等硬件.和各设备之间通信使用的是串口或网络(Socket)的方式.扫描头和贴标机使用的网络通信,输送线和称重机使用的是串口通 ...
- STC12C5A60S2 双串口通信
STC12C5A60S2单片机是一款功能比较强大的单片机,它拥有两个全双工串行通信接口,串口1的功能及操作与传统51单片机串行口相同:特殊的是STC12C5A60S2单片机内部有一个独立波特率发生器, ...
- mfc 调用Windows的API函数实现同步异步串口通信(源码)
在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信.串口通信方便易行,应用广泛. 一般情况下,工控机和各智能仪表通过RS485总线进行通信.RS485的通信方式是半 ...
- VS2008基于对话框的MFC上位机串口通信(C++实现)简单例程
首先,在 vs2008 环境下创建 MFC 运用程序 设置项目名称为 ComTest(这个地方随意命名,根据个人习惯),点击确定后,点击下一步 出现如下界面 选择"基于对话框"模式 ...
- 【C51】UART串口通信
我们常需要单片机和其他模块进行通信,数据传输,常用的方式就是串口通信技术. 常用来 单片机<-->电脑, 单片机<-->单片机之间通信. 串行通信 versus 并行通信 并 ...
- LabVIEW串口通信
Instrument I/O 利用LabVIEW内置的驱动程序库和具有工业标准的设备驱动软件,可对 GPIB(通用接口总线).Ethernet(以太网)接口.RS-232(标准串行接口总线)/RS-4 ...
- ARM学习笔记15——串口通信基本原理【转】
计算机串口基本理论 1.什么是串口? 2,什么是RS-232? 3,什么是RS-422? 4,什么是RS-485? 5,什么是握手? 1,什么是串口? 串口是计算机上一种非常通用的设备通信的协议(不要 ...
随机推荐
- mac下python实现vmstat
mac下没有linux/unix 的vmstat,只有vm_stat; sh-3.2# vm_statMach Virtual Memory Statistics: (page size of 409 ...
- 使用SQL Server 2014 In-Memory 内存数据库时需要注意的地方
转载: http://www.infoq.com/cn/articles/sql-server-2014-memory-database http://www.cnblogs.com/Amaranth ...
- kail2在虚拟机上的安装
首先先要安装虚拟机,打开安装包,下一步 选择典型 选择要安装到的目录,点下一步 4 输入密钥,下一步(密钥网上有很多我这边就例举一个,没用的话就自己找.我这个密钥是VM11 ...
- CSS3实现倒计时
CSS3实现倒计时小程序,界面如下: 代码如下: <style> body,html{ margin:0px; height:100%; } body{background: #000; ...
- emacs工程管理,cedet ede插件自动构建Make,Automake
鉴于自己一直都是在做客户端开发方面的工作,服务端很多知识都随着时间淡忘了,最近有一个计划,用一些时间补一下基础.所以早上很早就起床,花了一点时间大致浏览了一下BSD socket的相关API,然后用G ...
- 用 .NET Reflector 8 查看 System.Windows.Controls 命名空间下的类
为了学习自定义控件,就想看看WPF基本元素的代码.使用到工具.NET Reflector. System.Windows.Controls 命名空间在PresentationFramework.dll ...
- Webkit CSS properties
Webkit CSS properties -webkit-animation -webkit-animation-delay -webkit-animation-direction -webkit- ...
- java--实现将文字生成二维码图片,并在中间附上logo,下方附上文字
前段时间因为工作需要,要实现将一段文字或者url生成二维码,然后中间附上logo,下方正中间附上文字的功能. 上网找了几篇教程学习了下,由于没有保存借鉴的博文链接,所以就没po上参考文章的链接啦,感谢 ...
- android 视频的缩略图 缓存机制和 异步加载缩略图
在这次的工作开发项目中,涉及到一个视频缩略图的视频列表:这个在大家看来,制作视频缩略图就是两行代码就搞定的事.确实是这样的,百度一下,每个帖子都知道制作视频缩略图的方法,在这里确实也是一样的,但是我要 ...
- CMD魔法堂:CMD进入指定目录
一.前言 每次打开cmd默认目录总是当前用户目录,然后是一大轮cd命令才进入工作目录,哎,怎一个烦自了得.幸好我们可以通过批处理文件来进入指定目录,省心多了. 二.cmd命令介绍 CMD [/A ...