directshow读取usb设备对用的串口号_MODBUS通讯协议读取温湿度传感器的数据

1、MODBUS通讯协议介绍

MODBUS通讯协议是一种串行通信协议,是自动化仪表与可编程逻辑控制器(PLC)之间交换信息的一种方式。通过该协议,可将自动化仪表测量的流量、压力、温度、频率等电信号转换成工程量,用于自动化控制。

2、串口调试软件(ComMonitor)介绍

可以用串口调试软件调试自动化仪表(须支持RS485通讯),安装USB转485通讯电缆的驱动,查看计算机端口号:右击我的电脑图标,选择管理,单击设备管理器,单击端口,即可显示USB转485通讯电缆所使用的端口号。

将自动化仪表接上DC24V电源,并将RS485通讯的A、B两根线分别接至USB转485通讯电缆的A、B,然后将USB转485通讯电缆的USB口接至电脑的USB3.0口。

查看自动化仪表的站地址,打开温湿度传感器的参数配置工具,如下图所示。

f8f4123a8c594784f7b9d792d5c8931e.png

将串口号选择计算机实际使用的端口号COM3,点击测试波特率,将显示设备地址与设备波特率,并可根据实际情况修改。

82ec8bdfcd4f826cc671eefb052acb9e.png

修改设备站地址与波特率

打开串口调试软件,设置软件端口,波特率,数据位,校验位,停止位。点击“打开串口”按钮。

a4b8c89cf2bf948c6375077cda63cacc.png

串口调试软件

2ea412794f03cb0cd55393304814f359.png

3、现在即可读取温湿度传感器的温湿度值:按如下写入代码(读取湿度)

发送帧(十六进制):02 03 00 00 00 01 84 39

发送帧解读:02----设备站地址 03----功能码(读保持寄存器)

0000----寄存器起始地址 0001----寄存器长度

84----校验码低位 39----校验码高位

接收帧(十六进制):02 03 02 02 EF BC A8

接受帧解读:02----设备站地址 03----功能码(读保持寄存器)

02----有效字节数 02EF----湿度值(十六进制)

BCA8----校验码

将02EF十六进制)转换为十进制为751,即湿度值为75.1%

eccdee4944a63c74e69eea4d28c82c3c.png

读取仪表湿度值

4、现在即可读取温湿度传感器的温湿度值:按如下写入代码(读取温度)

发送帧(十六进制):02 03 00 01 00 01 D5 F9

发送帧解读:02----设备站地址 03----功能码(读保持寄存器)

0001----寄存器起始地址 0001----寄存器长度

D5----校验码低位 F9----校验码高位

接收帧(十六进制):02 03 02 00 BA 7D F7

接受帧解读:02----设备站地址 03----功能码(读保持寄存器)

02----有效字节数 00BA----温度值(十六进制)

7DF7----校验码

将00BA(十六进制)转换为十进制为186,即温度值为18.6℃

2cb7eaffd865aa836dbf48cf822bb698.png

读取仪表温湿度值

5、现在即可读取温湿度传感器的温湿度值:按如下写入代码(读取温湿度)

发送帧(十六进制):02 03 00 00 00 02 C4 38

发送帧解读:02----设备站地址 03----功能码(读保持寄存器)

0000----寄存器起始地址 0002----寄存器长度

C4----校验码低位 38----校验码高位

接收帧(十六进制):02 03 04 02 DF 00 B5 38 C6

接受帧解读:02----设备站地址 03----功能码(读保持寄存器)

04----有效字节数 02DF----湿度值(十六进制)

00B5----温度值(十六进制)

38C6----校验码

湿度转换:将02DF(十六进制)转换为十进制为735,即湿度值为73.5%

温度转换:将00B5(十六进制)转换为十进制为181,即温度值为18.1℃

5794009050b2d44cadac83df892d8288.png

读取仪表温湿度值

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Windows 平台上使用 DirectShow 进行音频编码,需要编写一个 DirectShow 滤镜来实现。下面简单介绍如何使用 LAME 库实现音频编码。 首先,需要在 DirectShow 滤镜中引入 LAME 库的头文件和库文件,然后在滤镜的构造函数中初始化 LAME 编码器,示例代码如下: ```c++ #include <lame/lame.h> class CLameEncoderFilter : public CTransformFilter { public: CLameEncoderFilter(LPUNKNOWN pUnk, HRESULT* phr); ~CLameEncoderFilter(); // ... private: lame_global_flags* m_pLameGlobalFlags; }; CLameEncoderFilter::CLameEncoderFilter(LPUNKNOWN pUnk, HRESULT* phr) : CTransformFilter(NAME("LAME Encoder Filter"), pUnk, CLSID_LameEncoderFilter) { // 初始化 LAME 编码器 m_pLameGlobalFlags = lame_init(); lame_set_in_samplerate(m_pLameGlobalFlags, 44100); lame_set_out_samplerate(m_pLameGlobalFlags, 44100); lame_set_num_channels(m_pLameGlobalFlags, 2); lame_set_brate(m_pLameGlobalFlags, 128); lame_init_params(m_pLameGlobalFlags); // ... } ``` 在滤镜的 Transform() 函数中,可以使用 LAME 库提供的 lame_encode_buffer() 或 lame_encode_buffer_interleaved() 函数对输入的 PCM 数据进行编码,并将编码后的 MP3 数据输出到输出端口。示例代码如下: ```c++ HRESULT CLameEncoderFilter::Transform(IMediaSample* pIn, IMediaSample* pOut) { // 获取输入数据指针和长度 BYTE* pInData = nullptr; pIn->GetPointer(&pInData); int nInSize = pIn->GetActualDataLength(); // 创建输出数据缓冲区 BYTE* pOutData = nullptr; int nOutSize = nInSize; // 假设编码后的数据大小和输入数据大小相同 pOut->GetPointer(&pOutData); pOut->SetActualDataLength(nOutSize); // 编码 PCM 数据为 MP3 数据 int nRet = lame_encode_buffer_interleaved(m_pLameGlobalFlags, (short*)pInData, nInSize/4, pOutData, nOutSize); if (nRet < 0) { // 编码失败 return E_FAIL; } // ... return S_OK; } ``` 注意,在使用 LAME 库编码音频数据时,需要根据输入数据的格式选择使用 lame_encode_buffer() 或 lame_encode_buffer_interleaved() 函数。上面的示例中使用了 lame_encode_buffer_interleaved() 函数,因为输入数据是交错的 PCM 数据。如果输入数据是分离的左右声道 PCM 数据,则应该使用 lame_encode_buffer() 函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值