CH347dll 在C#中调用的问题

使用WPF开发CH347T上位机,已对照官方的CH341的CSHARP例程对CH347DLL.H进行了重写,以下为CH347读数据的方法重写前后对比:

//SPI4读数据 无需先写数据,效率较CH347SPI_WriteRead高很多(原CH347DLL.H内接口)
BOOL WINAPI CH347SPI_Read(ULONG iIndex,     //指定设备序号
              ULONG iChipSelect,   //片选控制,位7为0则忽略片选控制,位7为1进行片选操作
              ULONG oLength,     //准备发出的字节数
              PULONG iLength,    //准备读入的数据字节数
			  PVOID ioBuffer);    //指向一个缓冲区,放置准备从DOUT写出的数据,返回后是从DIN读入的数据
//SPI4读数据 无需先写数据,效率较CH347SPI_WriteRead高很多(重写后的C#接口)
[DllImport("CH347DLL.DLL", EntryPoint = "CH347SPI_Read")]
public static extern bool CH347SPI_Read(uint iIndex,    //指定设备序号
                      uint iChipSelect, //片选控制,位7为0则忽略片选控制,位7为1进行片选操作
                      uint oLength,   //准备发出的字节数
                      uint iLength,   //准备读入的数据字节数
                      byte[] ioBuffer); //指向一个缓冲区,放置准备从DOUT写出的数据,返回后是从DIN读入的数据


我是C#新手,不太明白为什么PVOID ioBuffer 为什么是直接写成 byte[] ioBuffer,正常如果直接传缓冲区数组进去,接口里面的程序不会无法访问外面定义的缓冲区数组吗,在实际在调用过程中也是报错:

image.png


尝试更改传入的变量,改成IntPtr ioBuffer传数组首地址指针、或改成ref byte[] ioBuffer传数组引用、或是将数组首地址转为byte[]数组再传入,都是一样报错,不知道是不是CH347DLL.cs写的有问题,附上我重写的CH347DLL.cs,跪求解决方法


icon_rar.gifCH347DLLcs.zip


求助


您好,查看了您的代码,需要修改一下C#中CH347SPI_Read函数中的iLength 参数类型,原DLL中参数类型为PULONG,改写C#中可定义为ref UInt32 iLength。


非常感谢, SPI这边搞定了, 但是我用CH347的串口又出了点问题, 打开初始化都没问题, 但是发送的数据不对(波特率是对的), 再次请求支援orz


CH347Uart_Open(0);

CH347Uart_Init(0, 115200, 8, 0, 1, 10);


uint ilength = 8;

byte[] txdata = { 0X01, 0X02, 0X03, 0X04, 0X05, 0X06, 0X07, 0X08 };

CH347Uart_Write(0, ref txdata, ref ilength);


image.png


image.png



您好,去掉ref参数,写入的buf直接传值即可,修改代码如下:

image.png

image.png


只有登录才能回复,可以选择微信账号登录