本文提供一个用C#实现串口通讯实例,亲自编写,亲测可用!

开发环境:VS2008+.net FrameWork3.5(实际上2.0应该也可以)

第一步

创建一个WinForm窗体,拉入一些界面元素

重点就是,图中用红框标出的,工具箱——组件——SerialPort,做.net串口通讯,这是必备控件

第二步

设置SerialPort控件属性

用C#向串口发送数据没什么特别的,就是调用SerialPort的Write方法往串口写数据就行

但是从串口那里接收数据的方式就比较特别了

首先,需要在代码里声明一个特别的事件函数

private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
this.Invoke(new EventHandler(UpdateUIText));
}

此函数是用来绑定到SerialPort控件的DataReceived事件

顾名思义,这个事件就是在接收到串口返回的数据时触发,里面就一句代码

对这句代码有兴趣的可以私下再去研究,这里就不赘述了

总之,这句代码的用途就是用来调动另一个函数,对界面UI元素的值进行更新(当然你也可以在里面执行其他操作)

        private void UpdateUIText(object s, EventArgs e)
{
try
{
//必须要阻塞线程一段时间,以免在交易超时的情况下,由于read太快导致读取不完整
System.Threading.Thread.Sleep();
string txt = serialPort.ReadExisting();
txt_Received.Text = txt;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString());
}
}

第三步

开始写逻辑代码,废话不多说,直接贴上来

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; namespace WinForm串口通讯
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent(); } private void Form1_Load(object sender, EventArgs e)
{
string[] ports = System.IO.Ports.SerialPort.GetPortNames();
if (ports.Length == 0)
{
MessageBox.Show("本机没有串口!");
}
Array.Sort(ports);
serialPort.PortName = ports[0];//串口号COM3
serialPort.BaudRate = 115200;//波特率
serialPort.DataBits = 8;//数据位
serialPort.StopBits = System.IO.Ports.StopBits.One;//停止位
serialPort.Encoding = System.Text.Encoding.GetEncoding("GB2312");//此行非常重要,解决接收中文乱码的问题 // 打开串口
try
{
serialPort.Open();
}
catch (Exception ex)
{
//捕获到异常信息,创建一个新的comm对象,之前的不能用了。
serialPort = new System.IO.Ports.SerialPort();
//将异常信息传递给用户。
MessageBox.Show(ex.Message);
return;
}
} private void button1_Click(object sender, EventArgs e)
{
string msgOrder = txt_Msg.Text;
//MessageBox.Show(msgOrder);
serialPort.Write(msgOrder);
} private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
this.Invoke(new EventHandler(UpdateUIText));
} private void UpdateUIText(object s, EventArgs e)
{
try
{
//必须要阻塞线程一段时间,以免在交易超时的情况下,由于read太快导致读取不完整
System.Threading.Thread.Sleep(500);
string txt = serialPort.ReadExisting();
txt_Received.Text = txt;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString());
} } private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
try
{
if (serialPort != null && serialPort.IsOpen)
{
serialPort.Close();
serialPort.Dispose();
}
}
catch (Exception ex)
{
//将异常信息传递给用户。
MessageBox.Show(ex.Message);
return;
}
} }
}

至此,一个简单完整的串口通讯就完成了,希望对你们有所帮助

转载请别忘了标明出处,谢谢~

C#串口通讯的更多相关文章

  1. C#串口通讯实例

    本文参考<C#网络通信程序设计>(张晓明  编著) 程序界面如下图: 参数设置界面代码如下: using System; using System.Collections.Generic; ...

  2. delphi之动态库调用和串口通讯

    串口通讯: Spcomm 控件属性: CommName  :表示COM1,COM2等串口的名字: BaudRate:设定波特率9600,4800等 StartComm StopComm 函数Write ...

  3. 用SPCOMM 在 Delphi中实现串口通讯 转

      用Delphi 实现串口通讯,常用的几种方法为:使用控件如MSCOMM和SPCOMM,使用API函数或者在Delphi 中调用其它串口通讯程序.利用API编写串口通信程序较为复杂,需要掌握大量通信 ...

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

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

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

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

  6. 浅析PC机串口通讯流控制

    转自浅析PC机串口通讯流控制 我们在串行通讯处理中,常常看到RTS/CTS和XON/XOFF这两个选项,这就是两个流控制的选项,目前流控制主要应用于调制解调器的数据通讯中,但对普通RS232编程,了解 ...

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

    这次讲讲利用串口收发中断来进行串口通讯.STM32 上为每个串口分配了一个中断.也就是说无论是发送完成还是收到数据或是数据溢出都产生同一个中断.程序需在中断处理函数中读取状态寄存器(USART_SR) ...

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

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

  9. Java利用Rxtx进行串口通讯

    最近在做传感器数据采集的工作,底层是基于Zigbee的无线传感网络,所有数据采集到Zigbee协调器上然后通知上位机数据采集完成,上位机通过USB转串口去读取数据就可以了.那么问题来了,如何进行串口通 ...

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

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

随机推荐

  1. servlet开发(四)之ServletContext

    接上一篇. 2.3.4 利用ServletContext对象读取资源文件 比如我们要读取web项目中的配置文件. 项目目录结构如下: 使用ServletContext对象读取资源文件的示例代码如下: ...

  2. git记住提交密码的技巧

    修改.git包里面的config文件,添加 [credential] helper = store

  3. Thrift笔记(七)--回调源码分析

    网上找了写代码,东拼西凑写了个demo.开始server用的是阻塞io,不行,换成非阻塞的io就可以.这里可能需要注意下 thrift文件 namespace java com.gxf.thrift ...

  4. java计数

    计数 package com.demo; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent ...

  5. JS埋点 小结

    今天在看<大型网站性能监测.分析与优化>一书,提到性能监测方式,才知道有这个名词 “JS埋点”. 大概作用:通过在web页面中,添加js脚本,实现对页面性能监测(如加载时间.服务器响应时间 ...

  6. 201610-H5项目总结

    1.首屏进入动效使用jQuery的animate(); $('.btn_driver').animate({ left:'26%' },'slow'); $('.btn_show').animate( ...

  7. google搜索使用技巧

    1.输入框所有空格都被理解为加号2.搜索多个单词时,需要加上引号,会当字符串处理3.使用-(减号)剔除指定条件,如:'mongdb'-'nodejs'4.可以使用通配符,如'vue *'5.在指定网站 ...

  8. GeoServer中WMS、WFS的请求规范(转载)

    1.背景 1.1WMS简介 Web地图服务(WMS)利用具有地理空间位置信息的数据制作地图.其中将地图定义为地理数据可视的表现.这个规范定义了三个操作:GetCapabitities返回服务级元数据, ...

  9. Android MediaRecorder实现暂停断点录音功能

    基本原理如下:MediaRecorder通过MIC录音,系统没有自带的pause功能,每次暂停录音,都会结束本次的录音.现在本人的设计思路是:MediaRecorder录音暂停时,保存这段所录下的音频 ...

  10. Data truncation: Out of range value for column 'id' at row 1 ### The

    org.springframework.dao.DataIntegrityViolationException: ### Error updating database. Cause: com.mys ...