请参考C#的API文档:https://docs.microsoft.com/zh-cn/dotnet/api/system.io.ports.serialport?redirectedfrom=MSDN&view=netframework-4.5

通过串口读写数据,非常简单,只需要将控制拉到窗口位置即可,就可以在窗口的下方查看到串口控件的图标,点击图标,按下F4即可查看该串品的详细属性

也可以通过在代码中创建一个串口类,并在代码中直接操作串口收发数据

其中包括比较基础的端口名称、波特率、数据位、停止位、检验位等五个参数

也有只需要指定端口名称即可,其他参数保持默认

知识点:向串口发送数据并获取数据
只需要将serialPort加入至窗口中,并且指定其中的端口名及波特率,指定串口数据回应事件即可(DataReceived事件) 

然后在窗口加载事件中,将serialPort打开即可

,直接使用serialPort.writeLine方法即可将数据发送至端口

,已为serialPort指定了数据回应事件,当有数据从串口中返回,事件即会响应

示例项目

系统启动三个后台线程,

一个线程对应到更新当前时间

一个线程定时发送AA1086至串口7,并从串口7获得返回的数据

一个线程定时获取串口1的数据(修改为不需要后台线程)

示例代码

两个基础类,线程及定时,存放在Common文件夹中

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; using System.Threading; namespace MES_MonitoringClient.Common
{
/// <summary>
/// 多线程任务
/// </summary>
public class ThreadHandler
{
//
Thread _TThread = null; //默认后台运行
private const bool default_isBackground = true; //默认不自动运行
private const bool default_autoRun = false; public ThreadHandler(System.Threading.ThreadStart startFunction) : this(startFunction, default_isBackground, default_autoRun)
{ } public ThreadHandler(System.Threading.ThreadStart startFunction, bool isBackground) : this(startFunction, isBackground, default_autoRun)
{ } /// <summary>
/// 创建线程
/// </summary>
/// <param name="startFunction">运行方法</param>
/// <param name="isBackground">是否后台运行</param>
/// <param name="autoRun">是否自动运行</param>
public ThreadHandler(System.Threading.ThreadStart startFunction, bool isBackground, bool autoRun)
{
_TThread = new Thread(startFunction); //是否后台运行
_TThread.IsBackground = isBackground; //自动运行线程
if (autoRun)
{
_TThread.Start();
}
} /// <summary>
/// 开始线程
/// </summary>
public void ThreadStart()
{
_TThread.Start();
} /// <summary>
/// 查看线程执行状态
/// </summary>
/// <returns></returns>
public bool ThreadIsAlive()
{
return _TThread.IsAlive;
} /// <summary>
/// 查看线程
/// 前后台执行
/// </summary>
/// <returns></returns>
public string ThreadState()
{
return _TThread.ThreadState.ToString();
} /// <summary>
/// 当前线程唯一托管标识符
/// </summary>
/// <returns></returns>
public int ThreadManagedThreadId()
{
return _TThread.ManagedThreadId;
} /// <summary>
/// 等待线程结束
/// </summary>
public void ThreadJoin()
{
_TThread.Join();
}
}
}

ThreadHandler

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace MES_MonitoringClient.Common
{
/// <summary>
/// 定时器帮助类
/// 创建定时器=》开始执行任务
/// </summary>
public class TimmerHandler
{
//定时器
System.Timers.Timer _TTimer = null; //定时器默认执行一次
private const bool default_autoReset = false; //定时器默认一秒执行一次
private const int default_interval = ; //定时器创建后即刻运行
private const bool default_autoRun = false; public TimmerHandler(System.Timers.ElapsedEventHandler elapseEvent) : this(default_interval, elapseEvent, default_autoRun)
{ } public TimmerHandler(System.Timers.ElapsedEventHandler elapseEvent, bool autoRun) : this(default_interval, elapseEvent, autoRun)
{ } public TimmerHandler(int interval, System.Timers.ElapsedEventHandler elapseEvent, bool autoRun) : this(interval, default_autoReset, elapseEvent, autoRun)
{ } /// <summary>
/// 创建定时器
/// </summary>
/// <param name="interval">间隔时间(ms)</param>
/// <param name="autoReset">是否重复执行</param>
/// <param name="elapseEvent">定时事件</param>
/// <param name="autoRun">是否自动运行</param>
public TimmerHandler(int interval, bool autoReset, System.Timers.ElapsedEventHandler elapseEvent, bool autoRun)
{
_TTimer = new System.Timers.Timer(); //时间间隔
_TTimer.Interval = interval; //是否重复执行
_TTimer.AutoReset = autoReset; //定时器处理事件
_TTimer.Elapsed += elapseEvent; //定时器自动运行
if (autoRun)
{
_TTimer.Start();
}
} /// <summary>
/// 定时器是否可用
/// </summary>
/// <returns></returns>
public bool GetTimmerEnable()
{
return _TTimer.Enabled;
} /// <summary>
/// 开始定时器任务
/// </summary>
public void StartTimmer()
{
_TTimer.Start();
} /// <summary>
/// 关闭定时器任务
/// </summary>
public void StopTimmer()
{
_TTimer.Stop();
} /// <summary>
/// 删除定时器
/// </summary>
public void RemoveTimmer()
{
_TTimer.Stop();
_TTimer.Dispose();
}
}
}

TimmerHandler

最后是窗体的代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; using System.Threading;
using System.Diagnostics; namespace MES_MonitoringClient
{
public partial class frmMain : Form
{ /*---------------------------------------------------------------------------------------*/
//发送信号数量
static int sendDataCount = ;
//接收信号数量
static int receviedDataCount = ;
//发送信号错误数量
static int sendDataErrorCount = ;
//接收信号错误数量
static int receviedDataErrorCount = ; //向串口7发送的默认信号
static string mc_DefaultSignal = "AA1086"; //必须的串口端口
static string[] mc_DefaultRequiredSerialPortName = new string[] { "COM1", "COM7" }; //三个后台线程
static Common.ThreadHandler DateTimeThreadHandler = null;
static Common.ThreadHandler SerialPort1ThreadHandler = null;
static Common.ThreadHandler SerialPort7ThreadHandler = null; /*---------------------------------------------------------------------------------------*/
//后台线程变量
Thread timerThread = null; //定时器变量
System.Timers.Timer TTimer; /*主窗口方法*/
/*---------------------------------------------------------------------------------------*/ public frmMain()
{
InitializeComponent();
} /// <summary>
/// 主窗口加载事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void frmMain_Load(object sender, EventArgs e)
{
try
{
var sw = Stopwatch.StartNew();
//检测端口 //打开端口
serialPort7.Open();
serialPort1.Open(); //开始后台进程
DateTimeThreadHandler = new Common.ThreadHandler(new ThreadStart(DateTimeTimer), true, true);
//SerialPort1ThreadHandler = new Common.ThreadHandler(new ThreadStart(GetRFIDDataTimer), true, true);
SerialPort7ThreadHandler = new Common.ThreadHandler(new ThreadStart(SendDataToSerialPortTimer), true, true); label2.Text = DateTimeThreadHandler.ThreadState(); //MessageBox.Show("初始化共使用" + sw.ElapsedMilliseconds.ToString() + "毫秒"); sw.Stop();
}
catch (Exception ex)
{
ShowErrorMessage(ex.Message, "系统初始化");
}
} /// <summary>
/// 主窗口关闭中事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
{
DateTimeThreadHandler.ThreadJoin();
//SerialPort1ThreadHandler.ThreadJoin();
SerialPort7ThreadHandler.ThreadJoin(); if (serialPort1.IsOpen)
{
serialPort1.Close();
}
if (serialPort7.IsOpen)
{
serialPort7.Close();
}
} /*定时器方法*/
/*---------------------------------------------------------------------------------------*/ /// <summary>
/// 显示时间定时器
/// </summary>
private void DateTimeTimer()
{
Common.TimmerHandler TTimerClass = new Common.TimmerHandler(, true, (o, a) => {
SetDateTime();
}, true);
} /// <summary>
/// 获取串口1RFID定时器
/// </summary>
private void GetRFIDDataTimer()
{
Common.TimmerHandler TTimerClass = new Common.TimmerHandler(, true, (o, a) => {
GetRFIDData(mc_DefaultSignal);
}, true);
} /// <summary>
/// 发送AA1086至串口7定时器
/// </summary>
private void SendDataToSerialPortTimer()
{
Common.TimmerHandler TTimerClass = new Common.TimmerHandler(, true, (o, a) => {
SendDataToSerialPort(mc_DefaultSignal);
}, true);
} /*定时器委托*/
/*---------------------------------------------------------------------------------------*/ /// <summary>
/// 声明显示当前时间委托
/// </summary>
private delegate void SetDateTimeDelegate();
private void SetDateTime()
{
if (this.InvokeRequired)
{
try
{
this.Invoke(new SetDateTimeDelegate(SetDateTime));
}
catch (Exception ex)
{
//响铃并显示异常给用户
System.Media.SystemSounds.Beep.Play();
}
}
else
{
try
{
label1.Text = string.Format("当前时间:" + DateTime.Now);
}
catch (Exception ex)
{
//响铃并显示异常给用户
System.Media.SystemSounds.Beep.Play();
}
}
} /// <summary>
/// 声明发送数据至串口委托
/// </summary>
/// <param name="defaultSignal"></param>
private delegate void SendDataToSerialPortDelegate(string defaultSignal);
private void SendDataToSerialPort(string defaultSignal)
{
if (this.InvokeRequired)
{
SendDataToSerialPortDelegate sendDataToSerialPortDelegate = SendDataToSerialPort;
try
{
this.Invoke(sendDataToSerialPortDelegate, new object[] { defaultSignal });
}
catch (Exception ex)
{
//响铃并显示异常给用户
System.Media.SystemSounds.Beep.Play();
}
}
else
{
try
{
if (serialPort7.IsOpen)
{
serialPort7.WriteLine(defaultSignal);
sendDataCount += ;
//lab_SendDataCount.Text = "发送成功:" + sendDataCount;
}
}
catch (Exception ex)
{
sendDataErrorCount += ;
//lab_SendDataErrorCount.Text = "发送错误:" + sendDataErrorCount; //响铃并显示异常给用户
System.Media.SystemSounds.Beep.Play();
}
}
} /// <summary>
/// 声明获取RFID串口委托
/// </summary>
/// <param name="defaultSignal"></param>
private delegate void GetRFIDDataDelegate(string defaultSignal);
private void GetRFIDData(string defaultSignal)
{
if (this.InvokeRequired)
{
GetRFIDDataDelegate getRFIDDataDelegate = GetRFIDData;
try
{
this.Invoke(getRFIDDataDelegate, new object[] { defaultSignal });
}
catch (Exception ex)
{
//响铃并显示异常给用户
System.Media.SystemSounds.Beep.Play();
}
}
else
{
try
{
if (serialPort7.IsOpen)
{
serialPort7.WriteLine(defaultSignal);
sendDataCount += ;
//lab_SendDataCount.Text = "发送成功:" + sendDataCount;
}
}
catch (Exception ex)
{
sendDataErrorCount += ;
//lab_SendDataErrorCount.Text = "发送错误:" + sendDataErrorCount; //响铃并显示异常给用户
System.Media.SystemSounds.Beep.Play();
}
}
} /*窗口公共方法*/
/*---------------------------------------------------------------------------------------*/ /// <summary>
/// 显示系统错误信息
/// </summary>
/// <param name="errorTitle">错误标题</param>
/// <param name="errorMessage">错误</param>
private void ShowErrorMessage(string errorTitle,string errorMessage)
{
MessageBox.Show(errorMessage, errorTitle, MessageBoxButtons.OK, MessageBoxIcon.Error);
} /*获取串口数据事件*/
/*---------------------------------------------------------------------------------------*/ /// <summary>
/// 串口7获取数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void serialPort7_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
try
{
System.IO.Ports.SerialPort COM = (System.IO.Ports.SerialPort)sender;
//因为要访问UI资源,所以需要使用invoke方式同步ui
this.Invoke((EventHandler)(delegate
{
receviedDataCount += ;
//lab_ReceviedDataCount.Text = "接收成功:" + receviedDataCount; richTextBox1.AppendText(COM.ReadLine() + "\r");
}
)
);
}
catch (Exception ex)
{
//响铃并显示异常给用户
System.Media.SystemSounds.Beep.Play();
}
} /// <summary>
/// 串口1获取数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
try
{
System.IO.Ports.SerialPort COM = (System.IO.Ports.SerialPort)sender;
//因为要访问UI资源,所以需要使用invoke方式同步ui
this.Invoke((EventHandler)(delegate
{
richTextBox2.AppendText(COM.ReadLine() + "\r");
}
)
);
}
catch (Exception ex)
{
ShowErrorMessage("serialPort1_DataReceived", "RFID串口获取数据时出错");
//响铃并显示异常给用户
System.Media.SystemSounds.Beep.Play();
}
} private void serialPort1_ErrorReceived(object sender, System.IO.Ports.SerialErrorReceivedEventArgs e)
{
ShowErrorMessage("serialPort1_ErrorReceived", "RFID串口获取数据出错");
}
}
}

frmMain

c# winform读取及发送串口信号的更多相关文章

  1. 一篇提及如何通过串口读取并提取GPS信号的论文

    一篇提及如何通过串口读取并提取GPS信号的论文 作者:崔杰 梁计春 王国军 目前,在用计算机进行数据传输时,常用的是串行通信方式.在Visual C++的编程中,既可以用Windows API函数进行 ...

  2. C# 串口连接的读取与发送

    一.串口连接的打开与关闭 串口,即COM口,在.NET中使用 SerialPort 类进行操作.串口开启与关闭,是涉及慢速硬件的IO操作,频繁打开或关闭会影响整体处理速度,甚至导致打开或关闭串口失败. ...

  3. 向 Nginx 主进程发送 USR1 信号

    [1]Nginx重新打开日志文件 向 Nginx 主进程发送 USR1 信号.USR1 信号是重新打开日志文件: 方式一: kill -USR1 $(cat /usr/local/lib/ubcsrv ...

  4. 如何实现PyQt5与QML响应彼此发送的信号?

    对于PyQt5+QML+Python3混合编程,如何实现PyQt5与QML响应彼此发送的信号,这是一个棘手的问题. 大抵有如下五种方式: (要运行下面五个例子,千万不能在eric6中运行,会报错.错误 ...

  5. WinForm 读取Excel 数据显示到窗体中

    最近教学中,需要用到WinForm 读取Excel数据,于是就做了一个简单的,废话不多说,直接codding... //读取Excel的帮助类 class SqExcellHelper { publi ...

  6. CC2540 OSAL 学习其中原理,以及 给任务 添加 一个事件(定时发送串口消息)

    参考学习大神博客: http://blog.csdn.net/feilusia/article/details/51083953 : http://blog.csdn.net/xiaoleiacmer ...

  7. 向nginx发送reopen信号以重新打开日志文件

    先移动日志文件 mv /usr/local/openresty/nginx/logs/access.log /usr/local/openresty/nginx/logs/access.log.201 ...

  8. (原创)RS232串口信号定义

    好久没用动硬件了,串口更是好久没用用了. 曾经接口信号记得很清楚,久了,忘了. 今天,重新回顾,笔记记下. DB9接口分公头和母头,公头即插针头,电脑机箱上多少公头.母头即插孔座. 合理的硬件设计均以 ...

  9. 使用DMA方式发送串口数据

    一.初始化部分代码 //串口接收DMA缓存 uint8_t Uart_Rx[UART_RX_LEN] = {}; uint32_t Uart_Send_Buffer[] = {}; void USAR ...

随机推荐

  1. 使用L2正则化和平均滑动模型的LeNet-5MNIST手写数字识别模型

    使用L2正则化和平均滑动模型的LeNet-5MNIST手写数字识别模型 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献Tensorflow实战Google深度学习框架 实验平台: T ...

  2. js-之闭包的理解

    说说你对闭包的理解? 答:闭包是能够读取其它函数内部变量的函数.本质上闭包是将函数内部和函数外部连接起来的一座桥梁.由于js的链式作用域,因为函数也是对象,函数内部访问函数外部的变量就类似于子对象一级 ...

  3. [转]C++中cin、cin.get()、cin.getline()、getline()函数的简单总结

    参考原文:http://www.cnblogs.com/flatfoosie/archive/2010/12/22/1914055.html,另外做了一些修改~ 1.cin 2.cin.get() 3 ...

  4. CSS3实现鼠标hover的过渡效果

    我想让鼠标放在div上就让它旋转变大,离开div后它又恢复本来的样子. 于是我就想写一个JS,监听一个hover事件,当hover发生的时候,触发一个计时器,在计时器里写两个值,一个管角度,一个管宽度 ...

  5. Codeforces Round #419 (Div. 2) A-E

    上紫啦! E题1:59压哨提交成功翻盘 (1:00就做完了调了一个小时,还好意思说出来? (逃)) 题面太长就不复制了,但是配图很可爱所以要贴过来 九条可怜酱好可爱呀 A - Karen and Mo ...

  6. 51nod1471 小S的兴趣

    题目来源: CodeForces 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 320 小S喜欢有趣的事.但是,每个人的兴趣都是独特的.小S热衷于自问自答.有一天,小S想出了一个问题 ...

  7. 【CodeForces】901 C. Bipartite Segments

    [题目]C. Bipartite Segments [题意]给定n个点m条边的无向连通图,保证不存在偶数长度的简单环.每次询问区间[l,r]中包含多少子区间[x,y]满足只保留[x,y]之间的点和边构 ...

  8. Spring Data JPA笔记

    1. Spring Data JPA是什么 Spring Data JPA是Spring Data大家族中的一员,它对对持久层做了简化,用户只需要声明方法的接口,不需要实现该接口,Spring Dat ...

  9. bzoj 2741 可持久化trie

    首先我们设si为前i个数的xor和,那么对于询问区间[i,j]的xor和,就相当于si-1^sj,那么对于这道题的询问我们可以处理处si,然后对于询问[l,r],可以表示为在区间[l-1,r]里找两个 ...

  10. Coursera在线学习---第六节.构建机器学习系统

    备: High bias(高偏差) 模型会欠拟合    High variance(高方差) 模型会过拟合 正则化参数λ过大造成高偏差,λ过小造成高方差 一.利用训练好的模型做数据预测时,如果效果不好 ...