| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5175 人关注过本帖
标题:CAN与上位机通讯问题
只看楼主 加入收藏
pjtyzyq
Rank: 4
等 级:业余侠客
威 望:6
帖 子:232
专家分:240
注 册:2016-2-14
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:13 
CAN与上位机通讯问题
现有带CAN口上位机,拟用2个8路CAN直接与上位机通讯,厂家提供了dll链接库,弄了好几天还是不会读取/发送数据。请各位帮忙。[local]2[/local]资料见附件

[此贴子已经被作者于2016-3-19 14:02编辑过]

搜索更多相关主题的帖子: 资料 
2016-03-19 12:27
pjtyzyq
Rank: 4
等 级:业余侠客
威 望:6
帖 子:232
专家分:240
注 册:2016-2-14
收藏
得分:0 
UISimCanFunc.rar (1.54 MB)
2016-03-19 12:30
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:7 
用vfp?
2016-03-19 13:40
pjtyzyq
Rank: 4
等 级:业余侠客
威 望:6
帖 子:232
专家分:240
注 册:2016-2-14
收藏
得分:0 
回复 3楼 tlliqi
是的
2016-03-19 13:47
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:7 
使用手册有详细说明
主要参考两个文件
UISimCanFunc.h
UISimCanFunc.dll
一些常量或数据结构等定义在 UISimCanFunc.h 文件,主要的内容使用手册也有说明。
如果 API 库文件 UISimCanFunc.dll 支持 VFP,可以这样使用 API 的导出函数:
如:
函数 SearchDevice(dwDevType) 查找所有连接的网关设备,参数 dwDevType 设备类型,0x0D为所有类型、0x01为RS232CAN、0x08为PCICAN、0x04为USBCAN
假设 UISimCanFunc.dll 文件在当前默认目录
DECLARE LONG SearchDevice IN UISimCanFunc.dll LONG  && 声明
dwDevType = 0x0D  && 调用,查找所有类型设备
dwDevs = SearchDevice(dwDevType)
IF dwDevs > 0
    ? "找到的设备数量", dwDevs
ELSE
    ? "没有找到设备", dwDevs
ENDIF


[此贴子已经被作者于2016-3-19 15:36编辑过]

2016-03-19 15:33
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
因没有现场,测试不了。
如果调用那个函数有问题,可以将相关代码贴上来探讨一下。
2016-03-19 15:46
pjtyzyq
Rank: 4
等 级:业余侠客
威 望:6
帖 子:232
专家分:240
注 册:2016-2-14
收藏
得分:0 
回复 5楼 吹水佬
谢谢版主提示,这两天没上网,回复晚了,见谅。我试试,有问题再请教。
2016-03-20 19:12
pjtyzyq
Rank: 4
等 级:业余侠客
威 望:6
帖 子:232
专家分:240
注 册:2016-2-14
收藏
得分:0 
回复 5楼 吹水佬
我采用的是com口,始终找不到设备,运行结果为“0”。

ThisForm.Olecontrol1.Settings = "9600,n,8,1"
ThisForm. = 2
DECLARE LONG SearchDevice IN UISimCanFunc.dll LONG  && 声明
dwDevType = 0x01  && 调用,查找所有类型设备
dwDevs = SearchDevice(dwDevType)
IF dwDevs > 0
    ? "找到的设备数量", dwDevs
ELSE
    ? "没有找到设备", dwDevs
ENDIF

如果dwDevType = 0x0D  运行结果为“-1”
麻烦版主再给分析一下。

[此贴子已经被作者于2016-3-22 12:32编辑过]

2016-03-22 12:31
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
1、在“设备管理--端口--COM1--属性--端口设置”看看波特率是否9600和其他参数设置是否符合要求。
2、CAN设备是否正常连接启动。
2016-03-22 14:20
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
收藏
得分:0 
先不要用上位机通讯库做测试。用现成的、成熟的 API 或其他第三方的串口调试软件做测试你的串口状态。

和吹同志说的一样,首先检查你的PC机上是否有串口设备,即:在“设备管理--端口--COM1--属性--端口设置”,设备存在吗?有冲突吗?有黄色报警符号吗?

接下来测试串口的状态,其他第三方的串口调试软件网上太多了。
1. 用 MS 通讯库 MScomm32.ocx,参考:https://support.
或者 WMI 类库:https://msdn.

2. 用 API 方式:
可以用 API :CreateFile() 函数:http://www.

Do Decl

Local nIndex, cPort
For nIndex = 1 To 8  && 枚举 1-8 的 COM 端口
    cPort = "COM" + Transform(nIndex)
    ? "正在测试串口 " + m.cPort + ":", TestPort(m.cPort)
Endfor
* End of main

Function TestPort(cPort)
    #Define FILE_SHARE_READ      1
    #Define FILE_SHARE_WRITE     2
    #Define OPEN_EXISTING        3
    #Define GENERIC_READ         0x80000000
    #Define GENERIC_WRITE        0x40000000
    #Define FILE_FLAG_OVERLAPPED 0x40000000
    #Define INVALID_HANDLE_VALUE -1
    #Define FILE_ATTRIBUTE_NORMAL 128

    Local hPort, lnErr

    * hPort = CreateFile(cPort, GENERIC_READ, 0,0,;
        OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0)

    hPort = CreateFile(cPort,;
        BITOR(GENERIC_READ,GENERIC_WRITE),;
        0,0, OPEN_EXISTING,;
        BITOR(FILE_FLAG_OVERLAPPED, FILE_ATTRIBUTE_NORMAL), 0)

    If hPort = INVALID_HANDLE_VALUE
        lnErr = GetLastError()
        Return "错误 " + Transform(lnErr) +;
            ". " + GetErrorMessage(lnErr)
    Else
        = CloseHandle(hPort)
        Return "Ok"
    Endif
Endfunc


Procedure Decl
    Declare Integer CreateFile In kernel32;
        STRING lpFileName, Integer dwAccess, Integer dwShareMode,;
        INTEGER lpSecurityAttr, Integer dwCreationDisp,;
        INTEGER dwFlagsAndAttr, Integer hTemplateFile

    Declare Integer CloseHandle In kernel32 Integer hObject
    Declare Integer GetLastError In kernel32

    Declare Integer FormatMessage In kernel32;
        INTEGER dwFlags, Integer lpSource, Integer dwMessageId,;
        INTEGER dwLanguageId, Integer @lpBuffer,;
        INTEGER nSize, Integer Arguments

    Declare RtlMoveMemory In kernel32 As CopyMemory;
        STRING @Destination, Integer Source, Integer nLength
Endproc


Function GetErrorMessage(lnErr)
    #Define FORMAT_MESSAGE_ALLOCATE_BUFFER 256
    #Define FORMAT_MESSAGE_FROM_SYSTEM     4096
    #Define FORMAT_MESSAGE_IGNORE_INSERTS  512

    Local dwFlags, lpBuffer, lnLength, lpResult
    dwFlags = FORMAT_MESSAGE_ALLOCATE_BUFFER +;
        FORMAT_MESSAGE_FROM_SYSTEM + FORMAT_MESSAGE_IGNORE_INSERTS

    lpBuffer = 0
    lnLength = FormatMessage(dwFlags, 0, lnErr, 0, @lpBuffer, 0,0)
    If lnLength <> 0
        lpResult = Repli(Chr(0), 500)
        = CopyMemory (@lpResult, lpBuffer, lnLength)
        Return Strtran(Left(lpResult, lnLength), Chr(13) + Chr(10), "")
    Else
        Return "[]"
    Endif
Endfunc

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2016-03-22 16:26
快速回复:CAN与上位机通讯问题
数据加载中...
 
   



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

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