#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. php实现微信分享朋友圈

    class JSSDK {  private $appId;  private $appSecret; public function __construct($appId, $appSecret) ...

  2. MySQL集群原理详解

    1. 为什么需要分布式数据库2. MySQL Cluster原理3. MySQL Cluster的优缺点4. MySQL Cluster国内应用5. 参考资料 1. 为什么需要分布式数据库 随着计算机 ...

  3. lnmp 一键安装包

    系统需求: CentOS/RHEL/Fedora/Debian/Ubuntu/Raspbian Linux系统 需要5GB以上硬盘剩余空间 需要128MB以上内存(如果为128MB的小内存VPS,Xe ...

  4. springboot+thymeleaf 模板中传递参数误报错误 红色波浪线

    在使用IDEA开发SpringBoot项目时,使用了Thymeleaf模板引擎,在使用动态传参数时,HTML页面的动态参数出现了红色波浪线,情况如下如: 解决办法: 选择 File -> Set ...

  5. (三)宏 __cplusplus C/C++混合编程

    前面一些篇目的内容作为一个在校生,很少用到,可能工作的人会见得多一点,但是第一次整体性的学习还是不希望有落下的东西,虽然不常用但至少要有个印象 那么就进入第三篇<宏 __cplusplus> ...

  6. Stream中reduce()使用记录

    一.reduce()使用1.第一个参数是我们给出的初值,2.第二个参数是累加器,可以自己用实现接口完成想要的操作,这里使用Bigdecimal的add方法 3.最后reduce会返回计算后的结果 Bi ...

  7. DHTML和HTML有什么区别?有什么不同

    DHTML和HTML有什么区别?有什么不同 首先Dynamic HTML是一种制作网页的方式,而不是一种网络技术(就像JavaScript和ActiveX):它也不是一个标记.一个插件或者是一个浏览器 ...

  8. ARC 067 E - Grouping

    题面在这里! 很显然是个暴力dp. 我们先枚举一下 队伍人数的种类,然后再逆序枚举一下dp数组里的总人数(顺序就会算重),最后枚举一下这种队伍的数量,之后就可以O(1)算方案了. 具体的,O(1)算方 ...

  9. URAL 1881 Long problem statement

    1881. Long problem statement Time limit: 0.5 secondMemory limit: 64 MB While Fedya was writing the s ...

  10. curl多文件上传

    发送: header('Content-type:text/html; charset=utf-8'); //声明编码//模拟批量POST上传文件$url = 'http://test.cm/rece ...