怎么用matlab读取串口数据?

怎么用matlab读取串口数据?,第1张

s=serial('com1')//设置串口

set(s,'BaudRate',9600,'StopBits',1,'Parity','none','DataBits',8,'InputBufferSize',255)

//串口的一些设置,注意,'none'有引号,有些值如InputBufferSize只能在串口关闭时才能设置,

//所以不建议先打开串口

fopen(s)//打开串口

fwrite(s,100)//打100(十进制)写入串口也可以是一维数组,可以用示波器测com的第3个引脚

a=fread(s)

//读出串口数据,由于matlab是顺序执行的,所以这里读不到100,

//程序会卡在这里直到读到数据为止,好像是存完buffer吧,这里忘了。

//自己从com的第2个引脚给数据试试看就清楚了

fclose(s)//关闭串口

由于项目要求,项目为(B/S)架构 ,需要在页面上读取串口数据,于是就需要nodejs了

使用 nodejs 的一个插件 :serialport

现在先做个测试demo

1、先建立测试文件夹 

2、在文件夹中安装serialport ,在文件夹下的 cmd 中输入

3、可能会出现 一个警告可用忽略

4、安装后 编写读取串口 js 文件 testport.js

5、运行 js 在文件夹下 cmd 中输入

执行成功:

可能的问题:

问题一: Flie not found

这个是电脑上没有安装串口驱动,或者虚拟串口 

可用 虚拟串口程序

建立测试串口

问题二:Port is opening

需要加入 串口属性 autoOpen:false

使用System.IO.Port.SerialPort类实现串口通信

System.IO.Port.SerialPort类介绍

System.IO.Port.SerialPort是.NET Framework提供的 *** 作串行端口的类,里面提供了一些方法、属性和和事件供开发者调用 *** 作串口。

调用流程

1. 直接调用SerialPort的静态方法GetPortNames()获取当前计算机的串行端口名称数组

2.根据串口名称,初始化SerialPort对象,设置参数,调用Open()方法打开串口

3.调用Write()方法发送数据

4.注册接收数据的监听,获取数据(或者另起线程循环读取接收数据,本文使用注册监听方式接收数据)

具体代码实现

using System 

using System.IO.Ports 

using System.Text

namespace PortControlDemo  

{

public class PortControlHelper

{

#region 字段/属性/委托

/// <summary>

/// 串行端口对象

/// </summary>

private SerialPort sp

/// <summary>

/// 串口接收数据委托

/// </summary>

public delegate void ComReceiveDataHandler(string data)

public ComReceiveDataHandler OnComReceiveDataHandler = null

/// <summary>

/// 端口名称数组

/// </summary>

public string[] PortNameArr { getset}

/// <summary>

/// 串口通信开启状态

/// </summary>

public bool PortState { getset} = false

/// <summary>

/// 编码类型

/// </summary>

public Encoding EncodingType { getset} = Encoding.ASCII

#endregion

#region 方法

public PortControlHelper()

{

PortNameArr = SerialPort.GetPortNames()

sp = new SerialPort()

sp.DataReceived += new SerialDataReceivedEventHandler(DataReceived)

}

/// <summary>

/// 打开端口

/// </summary>

/// <param name="portName">端口名称</param>

/// <param name="boudRate">波特率</param>

/// <param name="dataBit">数据位</param>

/// <param name="stopBit">停止位</param>

/// <param name="timeout">超时时间</param>

public void OpenPort(string portName , int boudRate = 115200, int dataBit = 8, int stopBit = 1, int timeout = 5000)

{

try

{

sp.PortName = portName

sp.BaudRate = boudRate

sp.DataBits = dataBit

sp.StopBits = (StopBits)stopBit

sp.ReadTimeout = timeout

sp.Open()

PortState = true

}

catch (Exception e)

{

throw e

}

}

/// <summary>

/// 关闭端口

/// </summary>

public void ClosePort()

{

try

{

sp.Close()

PortState = false

}

catch (Exception e)

{

throw e

}

}

/// <summary>

/// 发送数据

/// </summary>

/// <param name="sendData"></param>

public void SendData(string sendData)

{

try

{

sp.Encoding = EncodingType

sp.Write(sendData)

}

catch (Exception e)

{

throw e

}

}

/// <summary>

/// 接收数据回调用

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void DataReceived(object sender, SerialDataReceivedEventArgs e)

{

byte[] buffer = new byte[sp.BytesToRead]

sp.Read(buffer, 0, buffer.Length)

string str = EncodingType.GetString(buffer)

if (OnComReceiveDataHandler != null)

{

OnComReceiveDataHandler(str)

}

}

#endregion

}  

}

View Code

三、编写Winform串口通信工具界面

界面预览


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11101182.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-13
下一篇 2023-05-13

发表评论

登录后才能评论

评论列表(0条)

保存