打印

问个关于68013的问题

[复制链接]
1975|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zyzyzy407|  楼主 | 2012-7-11 13:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
AN, CAN, TE, TI, ST
自己想写个Win32的DLL 想把68013的部分API封装一下
接收数据代码如下:
LONG Zy_Receive( BYTE CanNum,pZY_CAN_FRAME pRecvFrm,ULONG FrmNum,int WaitTime/*WaitTime待扩展*/ )//FrmNum:ZY_CAN_FRAME数组大小
{

BYTE epnum;

LONG inlen = 512;

//PUCHAR indata;

//UCHAR indata[512];


BYTE recvfrmnum = 0;


if(CAN0 == CanNum)

epnum = 3;
//EP6

else if(CAN1 == CanNum)

epnum = 4;
//EP8

else

return -1;


InEndpt = USBDevice->EndPoints[3];

InEndpt->XferData(indata,inlen);


if( 0 == (inlen%13) )

{

recvfrmnum = inlen/13;

for( int i = 0; i < recvfrmnum; i++ )

{



pRecvFrm->caninfo = indata[i*13];

pRecvFrm->id1 = indata[i*13+1];

pRecvFrm->id2 = indata[i*13+2];

pRecvFrm->id3 = indata[i*13+3];

pRecvFrm->id4 = indata[i*13+4];

for( int k = 0; k <= 7; k++ )

{

pRecvFrm->candata[k] = indata[i*13+5+k];


}

pRecvFrm++;
//不知道速率快了有没有影响 张勇的就有影响

}

return recvfrmnum;

}

else

{

return -1;
//返回-1说明出错

}

}

上位机MFC通过点击一次按钮实现单次接收
代码如下:
void CZyVCDllTestDlg::OnButton2()
{

// TODO: Add your control notification handler code here

ZY_CAN_FRAME testfrm;

ULONG a;

a = Zy_Receive( 0,&testfrm,1/*WaitTime待扩展*/ );

testfrm.id4 = 0x66;
}
现在出现的错误如下:
在DLL中采用UCHAR indata[512];定义indataMFC没有问题 但采用PUCHAR indata;时候当运行完a = Zy_Receive( 0,&testfrm,1/*WaitTime待扩展*/ );后会出现蓝屏 求教 在DLL中不能PUCHAR这样定义嘛?

相关帖子

沙发
dqyubsh| | 2012-7-11 22:27 | 只看该作者
指针未初始化,必须非法。

使用特权

评论回复
板凳
zyzyzy407|  楼主 | 2012-7-12 09:39 | 只看该作者
大侠 我初始化成PUCHAR indata=NULL; 也不成  应该怎样初始化?谢了 (可能这个问题有些低级 小弟不才) 2# dqyubsh

使用特权

评论回复
地板
dqyubsh| | 2012-7-13 11:24 | 只看该作者
要在主程序里分配空间,然后子程序指向这个地址。你试图向一个没有初始化空间的指针写数据,当然就挂了。

使用特权

评论回复
5
zyzyzy407|  楼主 | 2012-7-13 17:58 | 只看该作者
您的“主程序”指的是MFC上位机的程序中吗? 在子程序指向这个地址什么意思?没明白(本人有些笨 呵呵) 赐教 真心想知道!这段代码应该怎么写? 4# dqyubsh

使用特权

评论回复
6
dqyubsh| | 2012-7-14 10:37 | 只看该作者
去查查函数调用的章节。

大致是这样,
UCHAR indata[512];    // 事先分配空间
recv(&indata[0], len...);  // 传递数组的首地址

void recv(PUCHAR dat, .....)
{
     // 给dat填充数据
   

}

你写的这个,看不出读回的数据放哪了。

开始写程序别弄这么麻烦,不写DLL能实现就别写,简单一问一答能解决问题就不要搞成异步通讯,能不用线程就不要用,能少用就少用。相信自己一定会写出烂代码,所以要精炼、简单,而不是把简单问题弄复杂。

使用特权

评论回复
7
dqyubsh| | 2012-7-14 11:06 | 只看该作者
你点击一个按钮,取一次数据,明显是一问一答。把线程去掉,把DLL去掉,直接改成发命令->读数->显示的结构。

线程用在后台值守直接取数的场合,取回来的数据要做缓冲整理,比你这个要麻烦很多。

使用特权

评论回复
8
zyzyzy407|  楼主 | 2012-7-14 17:47 | 只看该作者
本帖最后由 zyzyzy407 于 2012-7-14 17:50 编辑

直接调用Cy的API可以 我以前没写过dll 想练练 所以...呵呵 我读回的数据放在ZY_CAN_FRAME pRecvFrm  我传进来一个数组的首地址 函数返回的就是就收的帧数(ZY_CAN_FRAME )现在就是在dll中那样定义指针(红色那种 PUCHAR indata;  )为什么不成() 是必须定义成数组吗(绿色那种UCHAR indata[512]; )?想知道原因 6# dqyubsh

使用特权

评论回复
9
dqyubsh| | 2012-7-17 07:20 | 只看该作者
摘录一段cybulk的代码,


        PUCHAR data = new UCHAR[xfer];       
        PUCHAR inData = new UCHAR[xfer];       

        ……

        delete [] data;
        delete [] inData;

PUCHAR定义的是一个指针,指针不过是指向某个内存地址,但这个地址后边的内存空间并没有分配给你的程序。直到new之后,一片连续的内存空间方才开辟出来,供你读写操作。

定义成数组,也是开辟空间的一种方式,它和new的差别在于一种是静态分配的,一种是动态申请、动态释放的。具体在堆还是栈里分配的你都别管了。

如果没有new操作,这个指针就是野指针,野指针相当于路边**,不能搞,搞它要死人的。有了new操作,这就是你女朋友或者情人,一段时间内可以搞,搞完可以甩了。数组是你老婆,你想甩它,要等你死了那天。

使用特权

评论回复
10
dqyubsh| | 2012-7-17 07:23 | 只看该作者
如果你不懂PUCHAR,那就别用。用unsigned char *,或者BYTE *,直观地看得出这是一个指针,这么用毫无问题,也没人笑话你。

使用特权

评论回复
11
zyzyzy407|  楼主 | 2012-7-17 10:22 | 只看该作者
我知道了 也就是说PUCHAR必须赋值! 谢了 10# dqyubsh

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

208

帖子

0

粉丝