C#版及nodejs版的com端口监听程序

news/2024/7/7 22:12:23

感受:

写监听程序的感受:原来有些事情并不是想象的那么难,难和简单就只在一个点上,一个点突破了,后面就豁然开朗了。所以有些问题,不能死闷,要先思考,然后查资料,然后问有经验的人。

最近写一个com端口监听程序,去读卡id,然后做相应的动作,写了两个版本的,一个是nodejs版本的,一个是C#版本的,两种语言都没有用过,通过一个上午的现学现卖,写出了一个初稿。程序写好了,发现只能读取部分卡的数据,并且读取的数据不是自己想要的,后来找了厂商的人,原来他们的波特率和我设置的不同,导致数据读取不同。这种问题果然要提前要一下各种硬件厂商的说明书,了解了他们的通信协议才能方便编程。

下面给出nodejs版和c#版的com端口监听程序。

node版:

var SerialPort = require("serialport").SerialPort;  //引入模块
var SlowBuffer = require('buffer').SlowBuffer;
var portName = 'COM3'; //定义串口名
var serialPort = new SerialPort("COM3", {baudRate: 115200,  //波特率dataBits: 8,    //数据位parity: 'none',   //奇偶校验stopBits: 1,   //停止位flowControl: false 
}, false); 
serialPort.open(function(error){ if(error){ console.log("打开端口"+portName+"错误:"+error);}else{  console.log("打开端口成功,正在监听数据中");serialPort.on('data',function(data){console.log(data);console.log(data.length);console.log(data[0]);console.log(Buffer.isBuffer(data));});serialPort.write("ls\n",function(err,results){console.log('err:'+err);console.log('results:'+results);});}
});

C#版

using System; //using 关键字的作用是导入命名空间
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.Ports;namespace MyFirstApp  // namespace 命名空间
{public class SerialTest{//串口对象private SerialPort _Comm = null;//串口控件初始化public void Init(){_Comm = new SerialPort("COM3");//串口参数设定_Comm.BaudRate = 115200;_Comm.Parity = Parity.None; //Parity为C#预定义枚举型变量_Comm.DataBits = 8;_Comm.StopBits = StopBits.One; //StopBits为C#预定义的枚举量_Comm.Handshake = Handshake.None;_Comm.RtsEnable = true;_Comm.ReadBufferSize = 1024;_Comm.WriteBufferSize = 512;_Comm.DtrEnable = true;//为控件添加事件处理函数 _Comm.DataReceived +=new SerialDataReceivedEventHandler(CommDataReceived);_Comm.ReceivedBytesThreshold = 1;_Comm.Open();Console.WriteLine("Press any key to continue...");Console.WriteLine();Console.ReadKey();}//串口数据处理函数public void CommDataReceived(Object sender, SerialDataReceivedEventArgs e){//Comm.BytesToRead中为要读入的字节长度int len = _Comm.BytesToRead;Console.WriteLine("len:"+len);Byte[] readBuffer = new Byte[len];_Comm.Read(readBuffer, 0, len); //将数据读入缓存//处理readBuffer中的数据foreach (Byte b in readBuffer){Console.WriteLine("读到数据:"+b);}}public void Stop(){_Comm.Close();}static void Main(string[] args) // Main方法,程序入口  {SerialTest test = new SerialTest();test.Init();}  }}

注意,一定注意参数的设置,有时候读取不到数据,很可能是参数设置的问题,比如BaudRate(波特率)最开始我设置为9600,死活读不到数据。后来联系厂商,那边通信是115200波特率,这才解决。


http://lihuaxi.xjx100.cn/news/243002.html

相关文章

[转] 程序员写简历的注意事项

Notus 注:原文比较长,经过删减归纳。主要内容总结如下 用 word 或 pages 制作, 导出为 pdf(考虑不同平台的阅读体验)。另外 word 格式也可以。 推荐的命名方式。提供少许信息,如姓名、职位、文档说明 举例:…

Java虚拟机中获得Runtime实例的方法是什么?

Runtime类用于表示Java虚拟机运行时的状态,它用于封装Java虚拟机进程。每次使用“java”命令启动Java虚拟机时都会对应一个Runtime实例,并且只有一个实例,应用程序会通过该实例与其运行时的环境相连。应用程序不能创建自己的Runtime实例&…

yyyy-MM-dd HH:mm:ss和yyyy-MM-dd hh:mm:ss

做项目,需要24小时制式的时间,误用了yyyy-MM-dd hh:mm:ss,导致出现一个很难发现的bug,现记录下,方便以后查阅。 yyyy-MM-dd hh:mm:ss 12小时制 yyyy-MM-dd HH:mm:ss 24小时制

HDU 2080 夹角有多大II

夹角有多大II Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 10901 Accepted Submission(s): 5642 Problem Description这次xhd面临的问题是这样的:在一个平面内有两个点,求两个点分别和…

web前端开发培训有哪些学习阶段

​ web前端技术主要针对于移动互联网是比较多的,对于零基础的同学来说前期主要学习基本的静态布局,HTML CSS,下面是web前端开发培训有哪些学习阶段的具体内容。 ​  web前端开发培训有哪些学习阶段? 一、html5如何学习 1.HTML5 CSS3 JQ …

javascript中实例方法与类方法的区别

在javascript中,类有静态属性和实例属性之分,也有静态方法和实例方法之分 类属性(静态属性):通过类直接访问,不需要声明类的实例来访问 类方法(静态方法):通过类直接访问…

ssh免密码登录的原理

工作第一天,就需要登录各种服务器,免密码登录无疑能大大的提高工作效率。以前只知道配置,今天了解了下原理。 免密码登录原理 图解,server A免登录到server B: 1.在A上生成公钥私钥。 2.将公钥拷贝给server B,要重命…

https和http有什么区别?看下面介绍就知道了!

https和http有什么区别?相信很多还在学习软测的同学们,都会有遇到这种问题,下面就是小编给大家介绍的http相关的知识 。 一、http和https基本概念 1. HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应…