CH341

Dim mBuffer(mCH341_PACKET_LENGTH) As Byte Dim mLength As UInteger Dim mInLen As UInteger mBuffer(0) = mCH341A_CMD_I2C_STREAM ' 命令码 mBuffer(1) = mCH341A_CMD_I2C_STM_STA mBuffer(2) = mCH341A_CMD_I2C_STM_OUT ' 输出数据,位5-位0为长度,0长度则只发送一个字节并返回应答 mBuffer(3) = &HA0 ' 数据

mBuffer(4) = mCH341A_CMD_I2C_STM_OUT ' 输出数据,位5-位0为长度,0长度则只发送一个字节并返回应答 mBuffer(5) = &H0 ' 数据

mBuffer(6) = mCH341A_CMD_I2C_STM_OUT ' 输出数据,位5-位0为长度,0长度则只发送一个字节并返回应答 mBuffer(7) = &H55 ' 数据

mBuffer(8) = mCH341A_CMD_I2C_STM_STO mBuffer(9) = mCH341A_CMD_I2C_STM_END ' 当前包提前结束 mLength = 10 mInLen = 0

If (CH341WriteRead(0, mLength, mBuffer(9), mCH341A_CMD_I2C_STM_MAX, 1, mInLen, mBuffer(9)) = True) Then ' 执行数据流命令,先输出再输入 MsgBox("写数据成功!", vbExclamation, "CH341") End If 为什么运行这个程序就卡死?麻烦哪位仁兄帮忙分析一下CH341WriteRead的用法!

Dim mBuffer(mCH341_PACKET_LENGTH) As Byte Dim mLength As UInteger Dim mInLen As UInteger mBuffer(0) = mCH341A_CMD_I2C_STREAM ' 命令码 mBuffer(1) = mCH341A_CMD_I2C_STM_STA mBuffer(2) = mCH341A_CMD_I2C_STM_OUT ' 输出数据,位5-位0为长度,0长度则只发送一个字节并返回应答 mBuffer(3) = &HA0 ' 数据

mBuffer(4) = mCH341A_CMD_I2C_STM_OUT ' 输出数据,位5-位0为长度,0长度则只发送一个字节并返回应答 mBuffer(5) = &H0 ' 数据

mBuffer(6) = mCH341A_CMD_I2C_STM_OUT ' 输出数据,位5-位0为长度,0长度则只发送一个字节并返回应答 mBuffer(7) = &H55 ' 数据

mBuffer(8) = mCH341A_CMD_I2C_STM_STO mBuffer(9) = mCH341A_CMD_I2C_STM_END ' 当前包提前结束 mLength = 10 mInLen = 0

If (CH341WriteRead(0, mLength, mBuffer(10), mCH341A_CMD_I2C_STM_MAX, 1, mInLen, mBuffer(10)) = True) Then ' 执行数据流命令,先输出再输入 MsgBox("写数据成功!", vbExclamation, "CH341") End If 为什么运行这个VB程序就卡死?麻烦哪位仁兄帮忙分析一下CH341WriteRead的用法!


VB编程直接调用串口控件实现RS-232到USB转换收发数据。为什么要象上述编程?有什么特别考虑和优点吗?以最简单的方法达到目的不是更好吗?


其实是CH341USB_I2C如果直接调用CH341.DLL中的ch341writei2c跟ch341readi2c这两个函数,其实是没检测ACK信号的,所以他们公司给了我一大段代码,我最后整理成上面那样在VC里可以实现检测ACK信号了,但现在要转到VB环境中去实现,发现运行时卡死,我不知道 CH341WriteRead(0, mLength, mBuffer(10),mCH341A_CMD_I2C_STM_MAX, 1, mInLen, mBuffer(10)) 这个函数在VB里怎么给各个变量赋值


CH341除了usb转异步串口功能之外还有usb转i2c,spi,mem,epp等功能。 请参考下面的代码: BOOL WINAPI IIC_OutByteCheckAck( // 输出一字节数据并检查应答是否有效 ULONG iIndex, // 指定CH341设备序号 UCHAR iOutByte ) // 准备写出的数据 { UCHAR mBuffer[ mCH341_PACKET_LENGTH ]; ULONG mLength, mInLen; mBuffer[ 0 ] = mCH341A_CMD_I2C_STREAM; // 命令码 mBuffer[ 1 ] = mCH341A_CMD_I2C_STM_OUT; // 输出数据,位5-位0为长度,0长度则只发送一个字节并返回应答 mBuffer[ 2 ] = iOutByte; // 数据 mBuffer[ 3 ] = mCH341A_CMD_I2C_STM_END; // 当前包提前结束 mLength = 4; mInLen = 0; if ( CH341WriteRead( iIndex, mLength, mBuffer, mCH341A_CMD_I2C_STM_MAX, 1, &mInLen, mBuffer ) ) { // 执行数据流命令,先输出再输入 if ( mInLen && ( mBuffer[ mInLen - 1 ] & 0x80 ) == 0 ) return( TRUE ); // 返回的数据的位7代表ACK应答位,ACK=0有效 } return( FALSE ); }


在VB中我用过函数CH341StreamI2C(mIndex, 2, buffer, 0, iBuff)成功,但是用CH341WriteRead就卡死,不知里面具体参数怎么设置,也不知道这个函数支不支持在VB中调用,求解!VB!VB!VB!VB!VB!VB!


与CH341WriteRead无关,CH341StreamI2C函数也调用了CH341WriteRead


Type mBuf mBuff(mCH341_PACKET_LENGTH) As Byte End Type

Function IIC_OutByteCheckAck(ByVal iIndex As Long,ByVal iOutByte As Byte) As Boolean Dim mBuffer As mBuf Dim mLength, mInLen mBuffer.mBuff(0) = mCH341A_CMD_I2C_STREAM mBuffer.mBuff(1) = mCH341A_CMD_I2C_STM_OUT mBuffer.mBuff(2) = iOutByte mBuffer.mBuff(3) = mCH341A_CMD_I2C_STM_END mLength = 4 mInLen = 0 If (CH341WriteRead( iIndex, mLength, mBuffer, mCH341A_CMD_I2C_STM_MAX, 1, mInLen, mBuffer )) Then If ( mInLen <>0 and (mBuffer.mBuff(mInLen-1) And &H80) = 0 ) Then IIC_OutByteCheckAck = True Exit Function End If End If IIC_OutByteCheckAck = FALSE End Function If ( mInLen <>0 and (mBuffer.mBuff(mInLen-1) And &H80) = 0 ) Then 这句可能写的有点问题,没测试


Type mBuf mBuff(mCH341_PACKET_LENGTH) As Byte End Type‘我在类中定义的

Private Sub Command2_Click()’按钮事件

Dim mBuffer As mBuf Dim mLength, mInLen As Long mBuffer.mBuff(0) = mCH341A_CMD_I2C_STREAM mBuffer.mBuff(1) = mCH341A_CMD_I2C_STM_OUT mBuffer.mBuff(2) = 20 mBuffer.mBuff(3) = mCH341A_CMD_I2C_STM_END mLength = 4 mInLen = 0

If (mOpen = True) Then If (CH341WriteRead(0, mLength, mBuffer, 32, 1, mInLen, mBuffer)) Then‘iIndex=0, ’mCH341A_CMD_I2C_STM_MAX=32 MsgBox "写数据成功!", vbExclamation, "CH341" Else: MsgBox "写数据失败!", vbExclamation, "CH341" End If Else MsgBox "设备未打开!", vbExclamation, "CH341PAR" End If

End Sub

程序还是卡死掉,什么原因呢?


CH341WriteRead函数是怎么声明的?


Declare Function CH341WriteRead Lib "CH341DLL.DLL" (ByVal iIndex As Long, ByVal iWriteLength As Long, ByRef iWriteBuffer As Any, ByVal iReadStep As Long, ByVal iReadTimes As Long, ByRef oReadLength As Long, ByRef oReadBuffer As Any) As Boolean ' CH341WriteRead 执行数据流命令,先输出再输入 ' iIndex, 指定CH341设备序号 ' iWriteLength, 写长度,准备写出的长度 ' iWriteBuffer, 指向一个缓冲区,放置准备写出的数据 ' iReadStep, 准备读取的单个块的长度, 准备读取的总长度为(iReadStep*iReadTimes) ' iReadTimes, 准备读取的次数 ' oReadLength, 指向长度单元,返回后为实际读取的长度 ' oReadBuffer 指向一个足够大的缓冲区,用于保存读取的数据


各位WCH的高手们,赶紧帮帮忙吧,在VB中如何实现CH341WriteRead这个函数,在VC中可以实现但转到VB中程序就卡死掉,zyw { M } 给了一个VB的程序,但还是卡死掉,求助!谢谢


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