tnblog
首页
视频
资源
登录

串口通讯

5259人阅读 2022/3/14 13:55 总访问:50773 评论:0 收藏:0 手机
分类: .NET
  • 串口通讯,又名:串行端口通讯 主要是通过代码控制硬件操作,中间需要进行连接(端口连接)

  • 本文主要介绍初步连接端口进行数据交互的操作。即:数据读写

  • 所用工具 VS(版本非独),串口工具,串口调试工具

  1. 获取虚拟串口工具

  • 第一个方法

      在电脑上找到:Microsoft Store工具 选择应用 单击搜索串口 选择:超级串口助手  或者 串口调试助手

      可以选择购买也可以选择试用,注意:搜索之后没有东西可能是没有登录,工具需要管理员权限,因为涉及到安装

  2.配置参数 (参数非独)


下面是调试工具的:


串口工具:端口一般为一组,默认COM1和COM2  然后单击Add pair 这时就是创建好虚拟端口了
串口调试工具:在虚拟串口添加好之后,调试工具可以获取到端口号,选择好之后按图配置参数,参数不唯一
                       主要配置参数就是:波特率,数据位,效验位,停止位   数据发送为二进制数据,至于这些参数的意义,可以自行百度
OK,正题来啦 代码到位
3.代码块
  创建控制台应用和窗体应用都可以,本例为控制台应用

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.IO.Ports;
  7. using System.Threading;
  8. namespace ModBus
  9. {
  10.     internal class Program
  11.     {
  12.         static void Main(string[] args)
  13.         {
  14.             SerialPort serial = new SerialPort();//新建串口对象
  15.             string portName = "COM1";//端口号
  16.             int baudRate = 9600;//波特率
  17.             Parity parity = Parity.None;//校检位
  18.             int databits = 8;//数据位
  19.             StopBits stopBits = StopBits.One;//终止位
  20.             Encoding encodingType = Encoding.ASCII;//编码类型
  21.             string SendData;
  22.             //------------------------------------------------------
  23.             //初始化
  24.             serial.PortName = portName;
  25.             serial.BaudRate = baudRate;
  26.             serial.Parity = parity;
  27.             serial.DataBits = databits;
  28.             serial.StopBits = stopBits;
  29.             serial.Encoding = encodingType;
  30.             serial.Open();//打开端口
  31.             //发送数据
  32.             SendData = "#011001\r"//设置发送命令 对应DO2通道打开
  33.             serial.Write(SendData);//发送命令
  34.             //SendData = "#011200\r";//控制DO2通道打开
  35.             //serial.Write(SendData);
  36.             //SendData = "$016\r";//查询状态信息(命令)
  37.             //serial.Write(SendData);
  38.             Thread.Sleep(1000);//线程延迟1000毫秒接受数据 using system.Threading
  39.             //接收数据
  40.             byte[] ReDatas = new byte[serial.BytesToRead];
  41.             serial.Read(ReDatas, 0, ReDatas.Length);
  42.             string content=new UTF8Encoding().GetString(ReDatas);//接收数据转换为字符串
  43.             Console.WriteLine(content);
  44.             //数据解析
  45.             int[] ReDatas_int = new int[7];
  46.             for (int i = 0; i <7; i++)
  47.             {
  48.                 if (content[i]<='9'&&content[i]>='0')
  49.                 {
  50.                     ReDatas_int[i] = content[i] - '0';
  51.                 }
  52.                 else if (content[i]<='Z'&&content[i]>='A')
  53.                 {
  54.                     ReDatas_int[i] = content[i] - 'A' + 10;
  55.                 }
  56.                 else
  57.                 {
  58.                     ReDatas_int[i]=content[i];
  59.                 }
  60.             }
  61.             int[] DOstuas = new int[8];//定义DO通道状态数组
  62.             int wei = ReDatas_int[2];//取第三位
  63.             for (int i = 0; i < 4; i++)
  64.             {
  65.                 DOstuas[i] = wei & 1;
  66.                 wei= wei>> 1;
  67.             }
  68.             wei = ReDatas_int[1];//取第二位
  69.             for (int i = 0; i < 4; i++)
  70.             {
  71.                 DOstuas[i + 4] = wei & 1;
  72.                 wei=wei>> 1;
  73.             }
  74.             //输出通道状态
  75.             for (int i = 0; i < 8; i++)
  76.             {
  77.                 Console.WriteLine("通道DO" + i + ":" + DOstuas[i]);
  78.             }
  79.             int[] DIstaus = new int[7];
  80.             wei = ReDatas_int[4];
  81.             for (int i = 0; i < 4; i++)
  82.             { 
  83.               DIstaus[i] = wei & 1;
  84.                 wei = wei>> 1;
  85.             }
  86.             wei= ReDatas_int[3];
  87.             for (int i = 0; i < 3; i++)
  88.             { 
  89.              DIstaus[i+4]= wei & 1;
  90.                 wei=(wei>> 1) & 1;
  91.             }
  92.             //状态输出
  93.             for (int i = 0; i < 7; i++)
  94.             {
  95.                 Console.WriteLine("通道DO" + i + ":" + DIstaus[i]);
  96.             }
  97.             serial.Close();//关闭端口
  98.         }
  99.     }
  100. }


注意这里多应用了两个工具包


Threading工具主要用于延迟执行
 
好了本文基本就该完了
注意调试的时候最好打一个断点,在open()方法的位置,防止流水执行,到时候会出现索引超出界限
因为后面的循环是用于获取数据并解析的,但是端口都没有给电脑发送数据,怎么可能可以获取呢对吧

  

评价
与其用时间去get一个未知的以后,不如做好现在,set自己一个好的以后
排名
23
文章
19
粉丝
5
评论
1
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术