| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1613 人关注过本帖
标题:还要麻烦各位了!
只看楼主 加入收藏
pjtyzyq
Rank: 4
等 级:业余侠客
威 望:6
帖 子:232
专家分:240
注 册:2016-2-14
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:8 
还要麻烦各位了!
接着上次《CAN与上位机通讯问题》,新买了USBCAN接口模块,按照吹版主的例子没问题了(函数库6.1.1),但下一步又遇到了问题:

就是函数库(6.1.2和6.1.3)涉及到了输出参数,又不知道怎么弄了,还得麻烦各位指点
搜索更多相关主题的帖子: 下一步 接口 
2016-05-24 19:04
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:10 
将问题函数的不同版本的声明对照看看
2016-05-24 19:41
pjtyzyq
Rank: 4
等 级:业余侠客
威 望:6
帖 子:232
专家分:240
注 册:2016-2-14
收藏
得分:0 
版主,我说的6.1.1、6.1.2、6.1.3不是版本的意思,是函数库中函数对应的章节。
对不起,我描述不清,让您费心了。
2016-05-24 19:52
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
以下是引用pjtyzyq在2016-5-24 19:52:24的发言:

版主,我说的6.1.1、6.1.2、6.1.3不是版本的意思,是函数库中函数对应的章节。
对不起,我描述不清,让您费心了。

哦,明白。
这三个函数大概看了一下,因无现场测试,实际数据在内存的存储格式不好说,只能按常理推测。
随手写,无测试,可能有笔误,只作参考。
程序代码:
#define UIDEV_ALL    0x0D

DECLARE LONG SearchDevice    IN UISimCanFunc.dll LONG            && 6.1.1
DECLARE LONG GetUimDevIdList IN UISimCanFunc.dll LONG, STRING@   && 6.1.2
DECLARE LONG GetUimDevInfo   IN UISimCanFunc.dll LONG, STRING@   && 6.1.3 

    * 获取 Dev 数量 
m_uiDeviceAmount = SearchDevice(UIDEV_ALL)
IF (m_uiDeviceAmount < 1)
        * 操作失败处理
    RETURN
ENDIF
    * 获取所有 Device 的编号  
m_pDevIdList = REPLICATE(0h00, 4 * m_uiDeviceAmount)
IF (m_uiDeviceAmount != GetUimDevIdList(UIDEV_ALL, @m_pDevIdList))
        * 操作失败处理
    RETURN
ENDIF
    * 获取所有 Device 的信息
    *     DEV_INFO_OBJ 结构:
    *     typedef struct _DEV_INFO_OBJ 
    *     {  
    *         DWORD dwDevType;             //4字节
    *         DWORD dwDevIndex;            //4字节
    *         UINT uiComIndex;             //4字节
    *         UINT uiBaudRate;             //4字节
    *         CHAR pszDevName[64];         //64字节
    *         UINT Protocol;               //4字节  
    *     } DEV_INFO_OBJ, *P_DEV_INFO_OBJ; //共84字节
    * dwDevType      设备类型 0x0D = 所有类型 0x01 = RS232CAN 0x08 = PCICAN 0x04 = USBCAN 
    * dwDevIndex     设备编号 调用 GetUimDevIdList 或 SetDevIndex 后得到的设备索引号。 
    * uiComIndex     系统为 RS232CAN 网关设备分配的 COM 口编号,这个成员变量只对 RS232网关设备有用。 
    * uiBaudRate     RS232CAN 网关设备与 PC 通讯的串口波特率,这个成员变量只对 RS232网关设备有用。 
    * pszDevName[64] 保存网关设备的名称 
    * Protocol       保留以后使用,现在可忽略     
objDevInfo = REPLICATE(0h00, 84)    && DEV_INFO_OBJ
FOR i=1 TO m_uiDeviceAmount
    IF GetUimDevInfo(CTOBIN(SUBSTR(m_pDevIdList,i*4-3,4),"4RS"), @objDevInfo) > 0
        ? "dwDevType  :", CTOBIN(SUBSTR(objDevInfo, 1,4), "4RS")
        ? "dwDevIndex :", CTOBIN(SUBSTR(objDevInfo, 5,4), "4RS")
        ? "uiComIndex :", CTOBIN(SUBSTR(objDevInfo, 9,4), "4RS")
        ? "uiBaudRate :", CTOBIN(SUBSTR(objDevInfo,13,4), "4RS")
        strDevName = SUBSTR(objDevInfo, 17, 64)
        strDevName = LEFT(strDevName, AT(0h00, strDevName)-1)
        ? "strDevName :", strDevName
    ENDIF
ENDFOR


[此贴子已经被作者于2016-5-24 22:22编辑过]

2016-05-24 22:06
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
有个问题要注意:
DEV_INFO_OBJ结构里面有几个成员的数据类型是UINT(无符号整型),如果其值是大于0x7FFFFFFF时,用CTOBIN()获取其数值是一个负数,此时就不能用CTOBIN()。
最好自定义一个函数来处理,如:
FUNCTION C2UINT(szValue)
    IF LEN(szValue) == 4
        RETURN ASC(SUBSTR(szValue, 1, 1))+;
               BITLSHIFT(ASC(SUBSTR(szValue, 2, 1)),  8)+;
               BITLSHIFT(ASC(SUBSTR(szValue, 3, 1)), 16)+;
               BITLSHIFT(ASC(SUBSTR(szValue, 4, 1)), 16) * 0x0100
    ENDIF
    MESSAGEBOX("调用 C2UINT() 字串长度超出范围")
    RETURN -1
ENDFUNC


[此贴子已经被作者于2016-5-25 08:18编辑过]

2016-05-25 08:16
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:10 
"4RS"
吹版,这个"4RS"是什么,我记得我上次问你1个系统托盘时,里面也用到这个"4RS"。当时不好意思再问你。。
2016-05-25 08:51
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
回复 6楼 mywisdom88
"4RS"
4 ... 32位数值(4字节长)
R ... 数值在内存格式是前低后高(低位在前高位在后,常用格式)。也有用前高后低,由编译环境设置决定。
      如数值:1234567890,前低后高内码:0hD2029649,前高后低内码:0h499602D2。
      下面结果是一样
      ? CTOBIN(0hD2029649, "4RS")
      ? CTOBIN(0h499602D2, "4S")
      所以,要视实际情况决定是否使用“R”,
S ... 保留最高位为符号位,最高位为1时是负数。
      如对于一个8位数(1字节):
      CTOBIN(0h7F, "1RS"),DEC: 127, BIN: 01111111
      CTOBIN(0h80, "1RS"),DEC:-128, BIN: 10000000
      CTOBIN(0h81, "1RS"),DEC:-127, BIN: 10000001
      CTOBIN(0hFF, "1RS"),DEC:  -1, BIN: 11111111

[此贴子已经被作者于2016-5-25 10:38编辑过]

2016-05-25 10:19
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:0 
以下是引用吹水佬在2016-5-25 10:19:16的发言:

"4RS"
4 ... 32位数值(4字节长)
R ... 数值在内存格式是前低后高(低位在前高位在后,常用格式)。也有用前高后低,由编译环境设置决定。
      如数值:1234567890,前低后高内码:0hD2029649,前高后低内码:0h499602D2。
      下面结果是一样
      ? CTOBIN(0hD2029649, "4RS")
      ? CTOBIN(0h499602D2, "4S")
      所以,要视实际情况决定是否使用“R”,
S ... 保留最高位为符号位,最高位为1时是负数。
      如对于一个8位数(1字节):
      CTOBIN(0h7F, "1RS"),DEC: 127, BIN: 01111111
      CTOBIN(0h80, "1RS"),DEC:-128, BIN: 10000000
      CTOBIN(0h81, "1RS"),DEC:-127, BIN: 10000001
      CTOBIN(0hFF, "1RS"),DEC:  -1, BIN: 11111111

这个4RS有这么多门路的阿。谢谢
2016-05-25 11:54
pjtyzyq
Rank: 4
等 级:业余侠客
威 望:6
帖 子:232
专家分:240
注 册:2016-2-14
收藏
得分:0 
非常感激吹版主,感激《编程论坛》。
2016-05-25 13:20
快速回复:还要麻烦各位了!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019329 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved