分类:
.NET
串口通讯,又名:串行端口通讯 主要是通过代码控制硬件操作,中间需要进行连接(端口连接)
本文主要介绍初步连接端口进行数据交互的操作。即:数据读写
所用工具 VS(版本非独),串口工具,串口调试工具
获取虚拟串口工具
第一个方法
在电脑上找到:Microsoft Store工具 选择应用 单击搜索串口 选择:超级串口助手 或者 串口调试助手
可以选择购买也可以选择试用,注意:搜索之后没有东西可能是没有登录,工具需要管理员权限,因为涉及到安装
第二个方法,在网上搜索串口工具和串口调试工具,资源还是有很多的
然后就是 Virtual Serial Port Driver Pro汉化破解版下载(附注册码) v6.9 - 软件学堂 (xue51.com)
访问这个网址下载虚拟串口工具
2.配置参数 (参数非独)
下面是调试工具的:
串口工具:端口一般为一组,默认COM1和COM2 然后单击Add pair 这时就是创建好虚拟端口了
串口调试工具:在虚拟串口添加好之后,调试工具可以获取到端口号,选择好之后按图配置参数,参数不唯一
主要配置参数就是:波特率,数据位,效验位,停止位 数据发送为二进制数据,至于这些参数的意义,可以自行百度
OK,正题来啦 代码到位
3.代码块
创建控制台应用和窗体应用都可以,本例为控制台应用
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO.Ports; using System.Threading; namespace ModBus { internal class Program { static void Main(string[] args) { SerialPort serial = new SerialPort();//新建串口对象 string portName = "COM1";//端口号 int baudRate = 9600;//波特率 Parity parity = Parity.None;//校检位 int databits = 8;//数据位 StopBits stopBits = StopBits.One;//终止位 Encoding encodingType = Encoding.ASCII;//编码类型 string SendData; //------------------------------------------------------ //初始化 serial.PortName = portName; serial.BaudRate = baudRate; serial.Parity = parity; serial.DataBits = databits; serial.StopBits = stopBits; serial.Encoding = encodingType; serial.Open();//打开端口 //发送数据 SendData = "#011001\r"; //设置发送命令 对应DO2通道打开 serial.Write(SendData);//发送命令 //SendData = "#011200\r";//控制DO2通道打开 //serial.Write(SendData); //SendData = "$016\r";//查询状态信息(命令) //serial.Write(SendData); Thread.Sleep(1000);//线程延迟1000毫秒接受数据 using system.Threading //接收数据 byte[] ReDatas = new byte[serial.BytesToRead]; serial.Read(ReDatas, 0, ReDatas.Length); string content=new UTF8Encoding().GetString(ReDatas);//接收数据转换为字符串 Console.WriteLine(content); //数据解析 int[] ReDatas_int = new int[7]; for (int i = 0; i <7; i++) { if (content[i]<='9'&&content[i]>='0') { ReDatas_int[i] = content[i] - '0'; } else if (content[i]<='Z'&&content[i]>='A') { ReDatas_int[i] = content[i] - 'A' + 10; } else { ReDatas_int[i]=content[i]; } } int[] DOstuas = new int[8];//定义DO通道状态数组 int wei = ReDatas_int[2];//取第三位 for (int i = 0; i < 4; i++) { DOstuas[i] = wei & 1; wei= wei>> 1; } wei = ReDatas_int[1];//取第二位 for (int i = 0; i < 4; i++) { DOstuas[i + 4] = wei & 1; wei=wei>> 1; } //输出通道状态 for (int i = 0; i < 8; i++) { Console.WriteLine("通道DO" + i + ":" + DOstuas[i]); } int[] DIstaus = new int[7]; wei = ReDatas_int[4]; for (int i = 0; i < 4; i++) { DIstaus[i] = wei & 1; wei = wei>> 1; } wei= ReDatas_int[3]; for (int i = 0; i < 3; i++) { DIstaus[i+4]= wei & 1; wei=(wei>> 1) & 1; } //状态输出 for (int i = 0; i < 7; i++) { Console.WriteLine("通道DO" + i + ":" + DIstaus[i]); } serial.Close();//关闭端口 } } }
注意这里多应用了两个工具包
Threading工具主要用于延迟执行
好了本文基本就该完了
注意调试的时候最好打一个断点,在open()方法的位置,防止流水执行,到时候会出现索引超出界限
因为后面的循环是用于获取数据并解析的,但是端口都没有给电脑发送数据,怎么可能可以获取呢对吧
评价
排名
6
文章
6
粉丝
16
评论
8
{{item.articleTitle}}
{{item.blogName}} : {{item.content}}
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2024TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术