C#基于WinForm实现串口通讯
作者:Iawfy_ 发布时间:2023-12-26 02:03:39
标签:C#,WinForm,串口通讯
串口通讯是一种计算机常用的数据传输方式。
程序运行如下:
首先,检查计算机的串口,并获取所有串口信息。
private void CheckPort()//检查串口是否可用
{
myLog(2, "检测串口开始!"); //log记录函数
comboBox1.Items.Clear();//清除控件中的当前值
string[] a = SerialPort.GetPortNames();
if (a.Length != 0)
{
for (int i = 0; i < a.Length; i++)
{
comboBox1.Items.Add(a[i]);
}
comboBox1.SelectedIndex = 0;//??
myLog(2, "检测串口完成");
}
else
{
myLog(2, "无可用串口...", true);
}
}
private void SetPort()//设置串口
{
try
{
serialPort1.PortName = comboBox1.Text.Trim();//串口名给了串口类
//波特率 虚拟串口的波特率好像不能修改,但得将其赋为空,不然报错
// serialPort1.BaudRate = Convert.ToInt32(comboBox2.Text.ToString().Trim());
// 9600;
serialPort1.BaudRate = Convert.ToInt32("".Trim());
//奇偶效验
if (comboBox5.Text.Trim() == "奇校验")
{
serialPort1.Parity = Parity.Odd;//将奇校验位给了sp的协议
}
else if (comboBox5.Text.Trim() == "偶校验")
{
serialPort1.Parity = Parity.Even;
}
else
{
serialPort1.Parity = Parity.None;
}
//停止位
if (comboBox4.Text.Trim() == "1.5")
{
serialPort1.StopBits = StopBits.OnePointFive;//设置停止位有几位
}
else if (comboBox4.Text.Trim() == "2")
{
serialPort1.StopBits = StopBits.Two;
}
else
{
serialPort1.StopBits = StopBits.One;
}
serialPort1.DataBits = Convert.ToInt16(comboBox3.Text.ToString().Trim());//数据位
serialPort1.Encoding = Encoding.UTF8;//串口通信的编码格式
serialPort1.Open();
}
catch { }
}
/// <summary>
/// Log记录
/// </summary>
/// <param name="aa">aa= 0为发送 1为接受 2为日常记录</param>
/// <param name="mystr">记录内容</param>
/// <param name="IsHint">true 显示弹框,false 不显示弹框 默认false</param>
private void myLog(int aa, string mystr, bool IsHint = false)
{
//log存放路径
string myypath = myPath + DateTime.Now.ToString("yyyyMMdd") + ".txt";
StreamWriter sw = new StreamWriter(myypath, true);
string tempSendstr;
if (aa == 0)
{
tempSendstr = DateTime.Now.ToString("HH:mm:ss.fff") + " " + serialPort1.PortName + " 发送--->>> " + mystr;
}
else if (aa == 1)
{
tempSendstr = DateTime.Now.ToString("HH:mm:ss.fff") + " " + serialPort1.PortName + " 接收<<<--- " + mystr;
}
else
{
tempSendstr = DateTime.Now.ToString("HH:mm:ss.fff") + " " + mystr;
}
sw.WriteLine(tempSendstr);
sw.Close();
//弹框提示
if (IsHint)
{
MessageBox.Show(mystr, "提示");
}
if (listBox1.Items.Count >= 10) listBox1.Items.Clear();
listBox1.Items.Add(tempSendstr);
}
大部分的笔记本都不带串口的,我们可以在网上下载 Configure Virtual Serial Port Driver,给自己的笔记本添加几对虚拟串口(虚拟串口都是成对且一一匹配的),再用串口调试助手就可以进行调试了。
数据的发送:
//发送
private void button3_Click(object sender, EventArgs e)
{
if(!serialPort1.IsOpen)
{
MessageBox.Show("串口未打开,请检查!");
return;
}
string mystr1 = textBox1.Text;
byte[] a = Encoding.UTF8.GetBytes(mystr1);
string mystr2 = Encoding.UTF8.GetString(a);
serialPort1.Write(mystr2);//将数据写入串行端口输出缓冲区
myLog(0, mystr2);
}
数据接收:
//串口接收数据
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Thread.Sleep(100);
this.Invoke((EventHandler)(delegate //异步委托一个线程
{
if (serialPort1.BytesToRead > 0)
{
byte[] a = new byte[serialPort1.BytesToRead];//读出缓冲区串口通信的字节
int readbytes = 0;
while (serialPort1.Read(a, readbytes, serialPort1.BytesToRead - readbytes) <= 0) ;
string str = UTF8Encoding.UTF8.GetString(a);
textBox2.Text = str + "\r\n";
myLog(1, str);
}
}));
}
这是串口之间字符串的发送与接收,如要进行十六进制的传输,只需要在数据发送和接收时将字符串转化成十六进制,再写进缓冲区或读取。
多条信息发送时,可能会出现下面的情况。
串口调试助手将三次发送的数据一起读出来了,此时我们只需要在发送时给上一定的延时即可。
这样就能实现串口多条信息的发送与接收了。
来源:https://blog.csdn.net/Iawfy_/article/details/116781212


猜你喜欢
- 先看下效果图:这个需要用到1个开源的 库,这个后面也会说下的。工程目录:1. MainActivity.javapublic class M
- 本文实例为大家分享了C++实现哈夫曼编码的具体代码,供大家参考,具体内容如下#include<iostream>#include
- 用VS2010 + OpenCV 2.4.9 实现简单人脸识别,供大家参考,具体内容如下首先放效果图(为了防止辣眼睛,后期处理了下):首先声
- 前言Spring Cloud默认为Zuul编写并启用了一些过滤器,这些过滤器有什么作用呢?我们不妨按照@EnableZuulServer、@
- 前言你是否在onStart()启动过某项任务却忘记在onStop()中取消呢?人不是机器,难免会有错漏。就算老手不会犯错,也不能保证新人不会
- 在上一篇文章中,我们学习了Camera的基本用法,并借助它们编写了一个例子,实现了类似于API Demos里的图片中轴旋转功能。不过那个例子
- 让我们来看看这段代码: import java.util.BitSet;import java.util.concurrent.C
- 前言在windows平台下实现高性能网络服务器,iocp(完成端口)是唯一选择。编写网络服务器面临的问题有:1 快速接收客户端的连接。2 快
- 1.基本思路①.创建已加锁应用的数据库(字段:_id,packagename),如果应用已加锁,将加锁应用的包名维护到数据库中②.已加锁+未
- 基本要点1、Lombok作用:在我们的实体类中,我们再也不需要声明get、set、有参无参等方法,统统可以通过Lombok注解来实现同样的功
- 一、自己封装URLConnection 连接请求类 public void downloadFile1() { try{ &nb
- 本文实例讲述了C#更改tabControl选项卡颜色的方法。分享给大家供大家参考,具体如下:private void Form1_Load(
- 以前也用过爬虫,比如使用nutch爬取指定种子,基于爬到的数据做搜索,还大致看过一些源码。当然,nutch对于爬虫考虑的是十分全面和细致的。
- StringUtils.isBlank()的使用在校验一个String类型的变量是否为空时,可以使用StringUtils.isBlank方
- Java 线程对比Thread,Runnable,Callablejava 使用 Thread 类代表线程,所有现场对象都必须是 Threa
- 今天对Android端水印进行了一个简单的优化,优化方式是对水印生成方式的修改。如图1修改为如图2。我们先简单了解一下图一水印是如生成得。/
- 用微信提供的SDK来实现分享:从http://open.weixin.qq.com下载Android相关的jar包,将libammsdk.j
- 依赖让我们先把 zip4j 依赖关系添加到我们的 pom.xml 文件中。<dependenc
- 1.例题题目描述迷宫由 n 行 m 列的单元格组成,每个单元格要么是空地,要么是障碍物。其中1表示空地,可以走通,2表示障碍物。给定起点坐标
- 将一个字符串转化成String[]数组,提供两种方法前言将字符串转化成数组提供两种方法:1.split("");2.to