#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. windows下mysql配置(第一次)

    忙活了大半天,总算配置好了,本文献给windows下没试用过Mysql的小白,勿喷 http://blog.csdn.net/z1074907546/article/details/51482718 ...

  2. JAVAEE——SSH项目实战05:用户注册、登陆校验拦截器、员工拜访客户功能和MD5加密

    作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7170519.html 一.用户注册   显示错误信息到页面上的另一种方法: public ...

  3. C#语法文本字面量

    C#语法文本字面量 在日常生活中,文本用来表示除了数字以外的内容.例如有一个叫“比尔”的人,他的职位为“科长”.那么,“比尔”和“科长”都可以称为文本.在计算机里,现实世界中的文本通常被称为字符和字符 ...

  4. web服务端安全之文件上传漏洞

    一.文件上传漏洞的原理 由于程序代码未对用户提交的文件进行严格的分析和检查,导致攻击者可以上传可执行的代码文件,从而获取web应用的控制权限. 常见于上传功能,富文本编辑器. 二.文件上传漏洞的防御 ...

  5. apache 监控

    当前加载模块 [root@controller01 ~]# httpd -lCompiled in modules: core.c mod_so.c http_core.c 当前版本[root@con ...

  6. CF1027F Session in BSU

    link 花絮: 这场看起来打得还不错的样子……(别问我是用哪个号打的). 然后听说这题的思想被出了好多次,女生赛也出过,quailty算法,然而当时没反应过来,而且时间不多啦. 题意: 有n个人,每 ...

  7. java知识回顾

    一.构造方法能不能被继承 当然不能,1.构造方法是类的唯一入口 2.构造方法与类名相同 3.子类构造方法中隐式的调用了父类的构造方法 二.值传递和引用传递.不变类和可变类.直接赋值和浅拷贝和深拷贝   ...

  8. Codeforces Round #351 (VK Cup 2016 Round 3, Div. 2 Edition) D. Bear and Two Paths 构造

    D. Bear and Two Paths 题目连接: http://www.codeforces.com/contest/673/problem/D Description Bearland has ...

  9. Jmeter实现webservice的接口测试

    前提条件 测试的URL:http://ws.webxml.com.cn/WebServices/WeatherWS.asmx 测试接口:getSupportCityString 获取城市的编码:htt ...

  10. java中HashMap在多线程环境下引起CPU100%的问题解决

    最近项目中出现了Tomcat占用CPU100%的情况,原以为是代码中出现死循环,后台使用jstack做了dump,发现是系统中不合理使用HashMap导致出现了死循环(注意不是死锁). 产生这个死循环 ...