#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. Mac下思维导图Xmind使用入门

    1.软件下载 中文官网地址: http://www.xmindchina.net   安装过程比较傻瓜化,这里就不截图了. 2.用Xmind设计软件模块: 1>.新建一个思维导图,如下图,选 ...

  2. 12:输出1到n位最大整数

    如果按照最简单的循环输出,会遇到边界问题,n非常大的话,int甚至long都不能满足需求,所以这里需要用数组或者是字符串来表示要输出的数字. 如果面试题给定了一个n位整数,那么就是大数问题,用字符串来 ...

  3. js constructor 和 instanceof

    说到这两个属性,那不得不说一下_proto_这个属性,通常这个属性是隐藏属性,是不允许被暴露的,而某些浏览器为了开发者能够很好的理解,而将这个属性暴露出来,比如Mozilla FireFox,这就是为 ...

  4. HDU - 1716 排列2 水题

    排列2 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  5. Linux-UDP-Socket编程

    接收CAN总线上的数据并将其发送出去 创建客户端: /******************************************************************** * co ...

  6. Form与ModelForm-下拉框或者多选注意//及字段补充

    一.Form 设计一张普通model表: class UserInfo(models.Model): name = models.CharField(verbose_name='员工姓名', max_ ...

  7. es6新增功能

    声明命令 1. let命令 ES6新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效.下面代码在代码块之中,分别用let和var声明了两个变量.然 ...

  8. Java 中的浮点数取精度方法

    Java 中的浮点数取精度方法 一.内容 一般在Java代码中取一个double类型的浮点数的精度,四舍五入或者直接舍去等的方式,使用了4种方法,推荐使用第一种,我已经封装成工具类了. 二.代码实现 ...

  9. 【10.29校内测试】【线段树】【DP】【二进制Trie树求最小值最大】

    Solution 标程太暴力惹QAQ 相当于是26棵线段树的说QAQ 不过我写了另一种写法,从大到小枚举每一个字母,标记字典序在这个字母之上的位置为1,每次都建一棵线段树,维护1的数量,即区间和. 修 ...

  10. BZOJ 1191: [HNOI2006]超级英雄Hero 匈牙利算法

    1191: [HNOI2006]超级英雄Hero Time Limit: 2 Sec  Memory Limit: 256 MBSubmit: xxx  Solved: 2xx 题目连接 http:/ ...