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#串口通讯教程 简化一切 只保留核心功能 这可能是最易于理解的一篇教程的更多相关文章

  1. 利用PDF.JS插件解决了本地pdf文件在线浏览问题(根据需要隐藏下载功能,只保留打印功能)

    我是在IE11和谷歌上做的测试,都可以显示,把做出的东西记录下来,方便大家还有自己学习! 可以在IIS7服务器上也可以下载Tomcat来做服务器 Tomcat下载地址   http://pan.bai ...

  2. 第20章 USART—串口通讯—零死角玩转STM32-F429系列

    第20章      USART—串口通讯 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fi ...

  3. 第20章 USART—串口通讯

    本章参考资料:<STM32F76xxx参考手册>USART章节. 学习本章时,配合<STM32F76xxx参考手册>USART章节一起阅读,效果会更佳,特别是涉及到寄存器说明的 ...

  4. C#中的WinFrom技术实现串口通讯助手(附源码)

    C#中的WinFrom技术实现串口通讯助手(附源码)   实现的功能: 1.实现自动加载可用串口. 2.打开串口,并且使用C#状态栏显示串口的状态. 3.实现了串口的接收数据和发送数据功能. 4.串口 ...

  5. 教程-Delphi MSComm 实时串口通讯

    Delphi  MSComm 实时串口通讯 MSComm控件具有丰富的与串口通信密切相关的属性,提供了对串口进行的多种操作,进而使串行通信变得十分简便.MSComm的控件属性较多,常用的属性如下:1) ...

  6. 西门子plc串口通讯方式

    西门子plc串口通讯的三种方式 时间:2015-10-25 14:31:55编辑:电工栏目:西门子plc 导读:西门子plc串口通讯的三种方式,分为RS485 串口通信.PPI 通信.MPI 通信,自 ...

  7. STM32F10x 学习笔记5(USART实现串口通讯 1)

    STM32F10x 系列单片机中都包含了USART 模块,所谓USART,就是通用同步异步收发器.通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间 ...

  8. C#串口通讯概念以及简单实现

    最近在研究串口通讯,其中有几个比较重要的概念,RS-232这种适配于上位机和PC端进行连接,RS-232只限于PC串口和设备间点对点的通信.它很简单的就可以进行连接,由于串口通讯是异步的,也就是说你可 ...

  9. Android串口通讯

    今天在整一个项目,需要利用串口通讯在网上看了好多人的帖子才稍微整出了一点头绪. 首先串口代码就是利用谷歌自己的api,将java代码放在java/android_serialport_api目录下,如 ...

随机推荐

  1. android sdk 下载

    不知道是因为最近kaihui还是怎么的,打开android sdk官方网站特别的慢,想下载最新版本的platform几乎变成不可能完成的任务,不知道为什么Google不像Apache那样在各国设立镜像 ...

  2. shell脚本举例

    1.有时在写一些以循环方式运行的监控脚本,设置时间间隔是必不可少的,下面是一个Shell进度条的脚本演示在脚本中生成延时. #!/bin/bash b='' for ((i=0;$i<=100; ...

  3. BRVAH(让RecyclerView变得更高效) (3)

    本文来自网易云社区 作者:吴思博 3 实现列表加载动画效果    3.1默认动画 我们只需将自建的 adapter 继承它对应满足需求的 Adapter,然后在 Activity 中实例化,通过ope ...

  4. 一步一步在ubuntu上安装即时通讯服务器-Openfire

    1.首先登录到ubuntu server.在安装openfire 服务器之前,先确保你的系统已经更新到最新.然后输入下面的命令,一行一行执行,最后安装可用的更新 sudo apt-get update ...

  5. E. A Magic Lamp

    E. A Magic Lamp Time Limit: 1000ms Case Time Limit: 1000ms Memory Limit: 32768KB   64-bit integer IO ...

  6. Linux 查看端口占用并杀掉进程

    1. 查看端口号占用情况: netstat -apn|grep 11305 tcp        0      0 10.65.42.27:80              172.22.142.20: ...

  7. HDU 1071 The area ——微积分

    [题目分析] 求二次函数和一次函数围成的面积. 先解方程求出一次函数和二次函数. 然后积分. 现在还是不会积分. [代码] #include <cstdio> #include <c ...

  8. 北京集训TEST13——PA(Goodness)

    题目: Description 桌面上放有 n 张卡牌.对于每张卡牌,一面是绿色的,另一面是红色的.卡牌的每一面都标有一个整数.对于卡牌a和卡牌b,卡牌a对卡牌b的好感度为卡牌a绿色面的数与卡牌b红色 ...

  9. 刷题总结——疫情控制(NOIP2012提高组)

    题目: 题目背景 NOIP2012 提高组 DAY2 试题. 题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点. H 国的首都 ...

  10. [JSOI2008]最大数 (线段树)

    题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制:L不超过当前数列的长度.(L>=0 ...