当前位置: 首页 > news >正文

C#中对串口的操作

C#中对串口的操作

  • 1、通过new SerialPort()创建串口对象
  • 2、通过MulGetHardwareInfo()查找当前的串口
  • 3、对串口对象(例子中的sp1)的其他属性进行配置
  • 4、弹出文件选择框,进行文件类型筛选;
  • 5、通过FileStream类打开前面选择的文件,获取数据
  • 6、从串口缓冲区取数据
  • 7、往串口缓冲区中写数据

1、通过new SerialPort()创建串口对象

public static SerialPort sp1 = new SerialPort();/*sp1为创建的串口对象名*/

        

2、通过MulGetHardwareInfo()查找当前的串口

        串口设备在Windows下的命名规则如下;我们可以在C#面板上创建一个ComboBox控件用于对当前电脑所接串口设备的显示("COMx"的显示格式)及选择交互。
在这里插入图片描述
        
在这里插入图片描述

int StartIndex = 0;
int EndIndex = 0;
string[] ss = MulGetHardwareInfo(HardwareEnum.Win32_PnPEntity, "Name");/*获取当前电脑上的串口设备名*/
cbSerial.Items.Clear();  /*cbSerial即上面描述的ComboBox控件对象名;进行Item清除*/
for (i = 0; i < ss.Length; i++)
{
	if (ss[i].Contains("(COM"))
	{
	    StartIndex = ss[i].LastIndexOf("COM");
	    EndIndex = ss[i].LastIndexOf(")");
	    cbSerial.Items.Add(ss[i].Substring(StartIndex, (EndIndex - StartIndex)));
	}
}

        

3、对串口对象(例子中的sp1)的其他属性进行配置

        对于串口,一般我们还需对其波特率,数据位、停止位、校验位等信息进行配置。同样,我们可以在面板上新建ComboBox对象用于交互。ComboBox对象的选项(如代码中cbParity的"无"、“奇校验”、“偶校验”等选项)可在该ComboBox控件的Item属性中设置。控件如下:
在这里插入图片描述

sp1.BaudRate = iBaudRate;       	/*波特率设置*/
sp1.DataBits = iDateBits;       	/*数据位设置*/
switch (cbStop.Text)                            
{
   case "1":
       sp1.StopBits = StopBits.One; /*停止位设置*/
       break;
   case "1.5":
       sp1.StopBits = StopBits.OnePointFive;
       break;
   case "2":
       sp1.StopBits = StopBits.Two;
       break;
   default:
       MessageBox.Show("Error:参数不正确!", "Error");
       break;
}

switch (cbParity.Text)             
{
   case "无":
       sp1.Parity = Parity.None;		/*校验位设置*/
       break;
   case "奇校验":
       sp1.Parity = Parity.Odd;
       break;
   case "偶校验":
       sp1.Parity = Parity.Even;
       break;
   default:
       MessageBox.Show("Error:参数不正确!", "Error");
       break;
}

        

4、弹出文件选择框,进行文件类型筛选;

OpenFileDialog open = new OpenFileDialog();
open.Filter = "(bin文件)|*.bin"; 			/*设置筛选的是bin格式的文件*/
if (open.ShowDialog() == DialogResult.OK)   /*判断是否已经进行了文件选择*/
{
  	/*对选择的文件的操作;文件路径名由open.FileName表示*/
}

        

5、通过FileStream类打开前面选择的文件,获取数据

/*通过FileInfo类获取文件的长度信息*/
FileInfo fi = new FileInfo(open.FileName);
long len = fi.Length;

/*通过FileStream类对文件进行数据读取*/
FileStream fs = new FileStream(open.FileName, FileMode.Open);
byte[] buffer = new byte[len];
fs.Read(buffer, 0, (int)len);
fs.Close();

        
对于Bin文件的读取,也可以通过BinaryReader来进行;如下:

ArrayList binArraylist  = new ArrayList();
byte ByteOfRead;

/*声明文件流*/
FileStream fs = new FileStream(open.FileName, FileMode.Open, FileAccess.Read);
/*创建读取器*/
BinaryReader brReader = new BinaryReader(fs);

while (brReader.BaseStream.Position < brReader.BaseStream.Length)/*文件未读完*/
{
    ByteOfRead = brReader.ReadByte();/*读取文件一个字节的数据,添加到binArraylist中去*/
    binArraylist.Add(ByteOfRead);
}
brReader.Close();

        

6、从串口缓冲区取数据

if (sp1.IsOpen)   /*判断串口属于打开的状态*/
{
	int LengthOfBuffer;
	if(False == sp1.IsOpen)     /*在对串口进行操作(sp1.方法)前的检查;防止关闭串口造成的死机*/
	{
		break;
	}
	LengthOfBuffer = SerialPortConnection.Form1.sp1.BytesToRead;  /*获取当前串口缓冲区的字节数*/
	byte[] Recvbuff = new byte[LengthOfBuffer];
	SerialPortConnection.Form1.sp1.Read(Recvbuff, offset, LengthOfBuffer); /*从串口缓冲区读取LengthOfBuffer个字节,存放到Recvbuff[offset]的起始位置*/
}

此外,也可以一个字节一个字节读取(通过返回值获取数据):

SerialPortConnection.Form1.sp1.ReadByte();

也可以一次读出当前缓冲区中的数据(通过返回值获取数据) :

SerialPortConnection.Form1.sp1.ReadExisting();

        

7、往串口缓冲区中写数据

sp1.Write(Source, Offset, Length); /*从Source[Offset] 处开始,取count个字节数据写入到串行端口*/

        

相关文章:

  • 看不见的含量
  • 诊断会话控制及保持/ECU复位(ISO14229系列之10/3E/11服务)
  • 就计算机学习问题与一名高二学生的邮件往来
  • ISO 15765-2(网络层服务)
  • 关于自动化诊断测试(CANoe.Diva的应用)
  • ISO14229之概述
  • 需求增加也要走保证金流程——CSDN外包实践(62)
  • DBC文件解析
  • Sun中国工程研究院院长王星耀:开源策略是为了挤掉微软
  • 使用DBCView编辑DBC文件过程(一)
  • 使用DBCView编辑DBC文件过程(二)
  • DBC和EXCEL相互转换
  • 中小企业需要什么样的软件服务?
  • DBC文件编辑——基于DBCVIew4.3
  • 最近在研究的一个东东-移动证券
  • 【EOS】Cleos基础
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • Docker: 容器互访的三种方式
  • echarts的各种常用效果展示
  • js写一个简单的选项卡
  • js中的正则表达式入门
  • js作用域和this的理解
  • mysql innodb 索引使用指南
  • Rancher-k8s加速安装文档
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • Ruby 2.x 源代码分析:扩展 概述
  • Service Worker
  • Web Storage相关
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 编写高质量JavaScript代码之并发
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 多线程事务回滚
  • 翻译:Hystrix - How To Use
  • 区块链共识机制优缺点对比都是什么
  • 三栏布局总结
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​​​​​​​​​​​​​​Γ函数
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • !!Dom4j 学习笔记
  • #1015 : KMP算法
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (南京观海微电子)——I3C协议介绍
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!