
串口通讯,又名:串行端口通讯 主要是通过代码控制硬件操作,中间需要进行连接(端口连接)
本文主要介绍初步连接端口进行数据交互的操作。即:数据读写
所用工具 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()方法的位置,防止流水执行,到时候会出现索引超出界限
因为后面的循环是用于获取数据并解析的,但是端口都没有给电脑发送数据,怎么可能可以获取呢对吧
评价
排名
23
文章
19
粉丝
5
评论
1
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:
50010702506256


欢迎加群交流技术