#include <octave/oct.h>
#include <windows.h>
#include <cstdint>
#include <fstream>
#include <dMatrix.h>
#include <int32NDArray.h> // CH341DLL Functions Prototype
typedef HANDLE WINAPI(*CH341OpenDevice_fn)(unsigned int iIndex); typedef void (*CH341CloseDevice_fn)(unsigned int iIndex); typedef BOOL WINAPI(*CH341SetStream_fn)(
unsigned int iIndex,
unsigned int iMode); typedef BOOL WINAPI(*CH341StreamI2C_fn)(
unsigned int iIndex,
unsigned int iWriteLength,
void * iWriteBuffer,
unsigned int iReadLength,
void * oReadBuffer); // Octave function declaration
DEFUN_DLD(i2c_rd, args, nargout, "USB I2C Read")
{
int32NDArray bytes;
size_t bytes_read; if(args.length() < ) {
octave_stdout << "\n --i2c_rd I2C_ADR REG_ADR [Bytes to Read]\n" << std::endl;
return octave_value_list();
} else if(args.length() == ) {
bytes = args().matrix_value();
bytes_read = bytes(, );
} else {
bytes(, ) = ;
bytes_read = ;
} // Load CH341DLL to Current Process
HMODULE hdll = LoadLibrary("CH341DLL.DLL"); if(NULL == hdll) {
octave_stdout <<"USB_I2C CH341DLL Load Failed!" << std::endl;
return octave_value_list();
} // Get CH341 Functions Handle
CH341OpenDevice_fn USBIO_OpenDevice = (CH341OpenDevice_fn) GetProcAddress(hdll, "CH341OpenDevice");
CH341CloseDevice_fn USBIO_CloseDevice = (CH341CloseDevice_fn) GetProcAddress(hdll, "CH341CloseDevice");
CH341SetStream_fn USBIO_SetStream = (CH341SetStream_fn) GetProcAddress(hdll, "CH341SetStream");
CH341StreamI2C_fn USBIO_StreamI2C = (CH341StreamI2C_fn) GetProcAddress(hdll, "CH341StreamI2C"); int32NDArray i2c_adr = args().int32_array_value();
int32NDArray reg_adr = args().int32_array_value(); Matrix result(, bytes_read);
uint8_t IBuf[bytes_read];
uint8_t OBuf[] = {uint8_t(i2c_adr(, )), uint8_t(reg_adr(, ))}; // Open CH341 Device
HANDLE devh = USBIO_OpenDevice(); if(devh == NULL) {
octave_stdout << "CH341 Open Failed!" << std::endl;
FreeLibrary(hdll);
return octave_value_list();
} if(!USBIO_SetStream(, 0x82)) {
octave_stdout << "CH341 SetStream Failed!" << std::endl;
USBIO_CloseDevice();
FreeLibrary(hdll);
return octave_value_list();
} // If number of bytes to read is not given.
if(!USBIO_StreamI2C(, , OBuf, bytes_read, IBuf)) {
octave_stdout << "CH341 Read Failed!" << std::endl;
} else {
for(size_t i = ; i < bytes_read; ++i) {
result(, i) = double(IBuf[i]);
}
} USBIO_CloseDevice();
FreeLibrary(hdll);
return octave_value(result);
}

Octave下操作CH341的更多相关文章

  1. Windows内核下操作字符串!

    * Windows内核下操作字符串! */ #include <ntddk.h> #include <ntstrsafe.h> #define BUFFER_SIZE 1024 ...

  2. Linux 下操作GPIO(两种方法,驱动和mmap)(转载)

    目前我所知道的在Linux下操作GPIO有两种方法: 1.编写驱动,这当然要熟悉Linux下驱动的编写方法和技巧,在驱动里可以使用ioremap函数获得GPIO物理基地址指针,然后使用这个指针根据io ...

  3. 在telnet下操作memcache详解(操作命令详解)

    这篇文章主要介绍了在telnet下操作memcache详解,telnet下的memcache操作命令详解,需要的朋友可以参考下 在定位问题.测试等时候经常需要对memcache的数据进行一些操作,但是 ...

  4. Linux 下操作gpio(两种方法,驱动和mmap)

    目前我所知道的在linux下操作GPIO有两种方法: 1.  编写驱动,这当然要熟悉linux下驱动的编写方法和技巧,在驱动里可以使用ioremap函数获得GPIO物理基地址指针,然后使用这个指针根据 ...

  5. 在 VS2008 下操作 Excel 的方法总结

      这些天做个软件,需要读取 Excel 并导入到数据库中,所以研究了一下在 VC 下操作 Excel 的方法,这里做个总结,以作备忘. 一.最常用的 OLE 自动化方式 这个方式应该说是功能最全的方 ...

  6. linux下操作gpio寄存器的方法

    一. 在驱动中: 1. 用的时候映射端口:ioremap; #define GPIO_OFT(x) ((x) - 0x56000000) #define GPFCON (*(volatile unsi ...

  7. 修改CentOS6.5默认主机名(root下操作)

    使用CentOS6.5官方镜像安装完毕之后,默认的主机名为localhost,不便管理,我们需要根据实际情况修改. 此处我准备讲默认的主机名 localhost 改为 comex01-ct65 第一步 ...

  8. Vector 是线程安全的,是不是在多线程下操作Vector就可以不用加Synchronized

    如标题一样,如果之前让我回答,我会说,是的,在多线程的环境下操作Vector,不需要加Synchronized. 但是我今天无意间看到一篇文章,我才发现我之前的想法是错误的,这篇文章的地址: http ...

  9. Docker下操作指令

    Docker下操作指令 以mysql为例 1.搜索镜像: #docker search mysql 2.拉取镜像 #docker pull mysql:5.7 3.加载镜像并绑定端口: #docker ...

随机推荐

  1. Jersey入门一:从Maven Archetype创建jersey项目

    1.用Ctrl+空格调出Spotlight搜索,输入ter调出终端窗口  2.在终端窗口进入将创建jersey项目的目录:  3.输入如下命令,创建一个名为的simple-service项目: m ...

  2. Pycharm 激活码(转) 有效期到2019/10月

    Pycharm 激活码(转) 有效期到2019/10月 2018年11月13日 17:15:32 may_ths 阅读数:64   [激活码激活] 修改hosts文件 添加下面一行到hosts文件,目 ...

  3. 查看锁信息(开启InnoDB监控)

    当前mysql版本:5.6.21 一.背景 在mysql处理死锁问题时,由于show engine innodb status输出来的死锁日志无任务事务上下文,并不能很好地诊断相关事务所持有的所有锁信 ...

  4. 美团外卖iOS多端复用的推动、支撑与思考

    背景 美团外卖2013年11月开始起步,随后高速发展,不断刷新多项行业记录.截止至2018年5月19日,日订单量峰值已超过2000万,是全球规模最大的外卖平台.业务的快速发展对技术支撑提出了更高的要求 ...

  5. redis集群错误解决:/usr/lib/ruby/gems/1.8/gems/redis-3.0.0/lib/redis/client.rb:79:in `call': ERR Slot 15495 is already busy (Redis::CommandError)

    错误信息: /usr/lib/ruby/gems/1.8/gems/redis-3.0.0/lib/redis/client.rb:79:in `call': ERR Slot 15495 is al ...

  6. javascript中switch的用法注意

    switch中文翻译过来是转换.切换的意思.用在js中,各个条件转换而执行不同代码.

  7. 监控cpu、内存 <shell>

    获取cpu.内存结果 pid=$1 #获取进程pid echo $pid interval=1 #设置采集间隔 while true do echo $(date +"%y-%m-%d %H ...

  8. C#中的特性 (Attribute) 入门 (二)

    C#中的特性 (Attribute) 入门 (二) 接下来我们要自己定义我们自己的特性,通过我们自己定义的特性来描述我们的代码. 自定义特性 所有的自定义特性都应该继承或者间接的继承自Attribut ...

  9. python中的urlencode和urldecode

    python将字符串转化成urlencode ,或者将url编码字符串decode的方法: 方法1: urlencode:urllib中的quote方法 >>> from urlli ...

  10. 02-c#基础之01-基础语法(一)

    1.注释符 1)注销 2) 解释 2.C#中的3种注释符 1)单行注释// 2)多行注释/*要注释的内容*/ 3)文档注释///多用来解释类或者方法 2.VS中的快捷键