版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、c#编写can上位机程序周立功can pci接口卡提供的示例代码都是vc,vb和delphi的,没有c#.net的例子。但是在使用c#调用can api的时候,由于这些api对数据类型的校验非常严格,所以,调试起来比较麻烦。摸索了一段时间,终于使用c# 2.0 vs.2008调用can api可以正常的发送接收数据了。 现在把api的声明提供如下,有同样需求的,就可以少走很多弯路了。view plaincopy to clipboardprint?01.public sealed class canapi 02. 03. /接口卡类型定义 04. public enum pcidevicety
2、pe 05. 06. vci_pci5121 =1, 07. vci_pci9810 =2, 08. vci_usbcan1 =3, 09. vci_usbcan2 =4, 10. vci_pci9820 =5, 11. vci_can232 =6, 12. vci_pci5110 =7, 13. vci_canlite =8, 14. vci_isa9620 =9, 15. vci_isa5420 =10, 16. vci_pc104can = 11, 17. vci_canete =12, 18. vci_dnp9810 =13, 19. vci_pci9840 =14, 20. vci_
3、pci9820i =16 21. 22. 23. /函数调用返回状态值 24. public static readonly int status_ok =1; 25. public static readonly int status_err =0; 26. 27. public enum errortype 28. 29. /can错误码 30. err_can_overflow =0x0001, /can控制器内部fifo溢出 31. err_can_erralarm =0x0002, /can控制器错误报警 32. err_can_passive =0x0004, /can控制器消极错
4、误 33. err_can_lose =0x0008, /can控制器仲裁丢失 34. err_can_buserr =0x0010, /can控制器总线错误 35. 36. /通用错误码 37. err_deviceopened =0x0100, /设备已经打开 38. err_deviceopen =0x0200, /打开设备错误 39. err_devicenotopen =0x0400, /设备没有打开 40. err_bufferoverflow =0x0800, /缓冲区溢出 41. err_devicenotexist =0x1000, /此设备不存在 42. err_loadk
5、erneldll =0x2000, /装载动态库失败 43. err_cmdfailed =0x4000, /执行命令失败错误码 44. err_buffercreate =0x8000 /内存不足 45. 46. 47. 48. 49. 50. /1.zlgcan系列接口卡信息的数据类型。 51. structlayout(layoutkind.sequential, charset = charset.ansi) 52. public struct vci_board_info 53. 54. public ushort hw_version; 55. public ushort fw_v
6、ersion; 56. public ushort dr_version; 57. public ushort in_version; 58. public ushort irq_num; 59. public byte can_num; 60. system.runtime.interopservices.marshalasattribute(system.runtime.interopservices.unmanagedtype.byvaltstr, sizeconst = 20) 61. public string str_serial_num; 62. system.runtime.i
7、nteropservices.marshalasattribute(system.runtime.interopservices.unmanagedtype.byvaltstr, sizeconst = 40) 63. public string str_hw_type; 64. system.runtime.interopservices.marshalasattribute(system.runtime.interopservices.unmanagedtype.byvalarray, sizeconst = 4, arraysubtype = system.runtime.interop
8、services.unmanagedtype.u2) 65. public ushort reserved; 66. 67. 68. /2.定义can信息帧的数据类型。 69. structlayout(layoutkind.sequential, charset = charset.ansi) 70. public struct vci_can_obj 71. 72. public uint id; 73. public uint timestamp; 74. public byte timeflag; 75. public byte sendtype; 76. public byte re
9、moteflag;/是否是远程帧 77. public byte externflag;/是否是扩展帧 78. public byte datalen; 79. marshalas(unmanagedtype.byvalarray, sizeconst = 8, arraysubtype = unmanagedtype.i1) 80. public byte data; 81. marshalas(unmanagedtype.byvalarray, sizeconst = 3, arraysubtype = unmanagedtype.i1) 82. public byte reserved;
10、 83. 84. 85. /3.定义can控制器状态的数据类型。 86. structlayout(layoutkind.sequential, charset = charset.ansi) 87. public struct vci_can_status 88. 89. public byte errinterrupt; 90. public byte regmode; 91. public byte regstatus; 92. public byte regalcapture; 93. public byte regeccapture; 94. public byte regewlim
11、it; 95. public byte regrecounter; 96. public byte regtecounter; 97. public uint reserved; 98. 99. 100. /4.定义错误信息的数据类型。 101. structlayout(layoutkind.sequential, charset = charset.ansi) 102. public struct vci_err_info 103. 104. public uint errcode; 105. 106. system.runtime.interopservices.marshalasatt
12、ribute(system.runtime.interopservices.unmanagedtype.byvalarray, sizeconst = 3, arraysubtype = system.runtime.interopservices.unmanagedtype.i1) 107. public byte passive_errdata; 108. 109. public byte arlost_errdata; 110. 111. 112. /5.定义初始化can的数据类型 113. structlayout(layoutkind.sequential, charset = ch
13、arset.ansi) 114. public struct vci_init_config 115. 116. public uint acccode; 117. public uint accmask; 118. public uint reserved; 119. public byte filter; 120. public byte timing0; 121. public byte timing1; 122. public byte mode; 123. 124. structlayout(layoutkind.sequential, charset = charset.ansi)
14、 125. public struct chgdesipandport 126. 127. system.runtime.interopservices.marshalasattribute(system.runtime.interopservices.unmanagedtype.byvaltstr, sizeconst = 10) 128. public string szpwd; 129. 130. system.runtime.interopservices.marshalasattribute(system.runtime.interopservices.unmanagedtype.b
15、yvaltstr, sizeconst = 20) 131. public string szdesip; 132. 133. public int desport; 134. 135. 136. #region api函数 137. 138. dllimport(controlcan.dll, entrypoint = vci_opendevice, charset = charset.ansi, callingconvention = callingconvention.stdcall) 139. public static extern uint vci_opendevice(uint
16、devicetype, uint deviceind, uint reserved); 140. 141. dllimport(controlcan.dll, entrypoint = vci_closedevice, charset = charset.ansi, callingconvention = callingconvention.stdcall) 142. public static extern uint vci_closedevice(uint devicetype, uint deviceind); 143. 144. dllimport(controlcan.dll, en
17、trypoint = vci_initcan, charset = charset.ansi, callingconvention = callingconvention.stdcall) 145. public static extern uint vci_initcan(uint devicetype, uint deviceind, uint canind, ref vci_init_config pinitconfig); 146. 147. 148. dllimport(controlcan.dll, entrypoint = vci_readboardinfo, charset =
18、 charset.ansi, callingconvention = callingconvention.stdcall) 149. public static extern uint vci_readboardinfo(uint devicetype, uint deviceind, ref vci_board_info pinfo); 150. 151. dllimport(controlcan.dll, entrypoint = vci_readerrinfo, charset = charset.ansi, callingconvention = callingconvention.s
19、tdcall) 152. public static extern uint vci_readerrinfo(uint devicetype, uint deviceind, uint canind, ref vci_err_info perrinfo); 153. 154. 155. dllimport(controlcan.dll, entrypoint = vci_readcanstatus, charset = charset.ansi, callingconvention = callingconvention.stdcall) 156. public static extern u
20、int vci_readcanstatus(uint devicetype, uint deviceind, uint canind, ref vci_can_status pcanstatus); 157. 158. dllimport(controlcan.dll, entrypoint = vci_getreference, charset = charset.ansi, callingconvention = callingconvention.stdcall) 159. public static extern uint vci_getreference(uint devicetyp
21、e, uint deviceind, uint canind, uint reftype, object pdata); 160. 161. dllimport(controlcan.dll, entrypoint = vci_setreference, charset = charset.ansi, callingconvention = callingconvention.stdcall) 162. public static extern uint vci_setreference(uint devicetype, uint deviceind, uint canind, uint re
22、ftype, object pdata); 163. 164. dllimport(controlcan.dll, entrypoint = vci_getreceivenum, charset = charset.ansi, callingconvention = callingconvention.stdcall) 165. public static extern uint vci_getreceivenum(uint devicetype, uint deviceind, uint canind); 166. 167. dllimport(controlcan.dll, entrypo
23、int = vci_clearbuffer, charset = charset.ansi, callingconvention = callingconvention.stdcall) 168. public static extern uint vci_clearbuffer(uint devicetype, uint deviceind, uint canind); 169. 170. dllimport(controlcan.dll, entrypoint = vci_startcan, charset = charset.ansi, callingconvention = calli
24、ngconvention.stdcall) 171. public static extern uint vci_startcan(uint devicetype, uint deviceind, uint canind); 172. 173. dllimport(controlcan.dll, entrypoint = vci_resetcan, charset = charset.ansi, callingconvention = callingconvention.stdcall) 174. public static extern uint vci_resetcan(uint devi
25、cetype, uint deviceind, uint canind); 175. 176. dllimport(controlcan.dll, entrypoint = vci_transmit, charset = charset.ansi, callingconvention = callingconvention.stdcall) 177. public static extern uint vci_transmit(uint devicetype, uint deviceind, uint canind, ref vci_can_obj psend, uint len); 178.
26、 179. dllimport(controlcan.dll, entrypoint = vci_receive, charset = charset.ansi, callingconvention = callingconvention.stdcall) 180. public static extern uint vci_receive(uint devicetype, uint deviceind, uint canind, ref vci_can_obj preceive, uint len, int waittime); 181. 182. 183. #endregion 184.
27、public sealed class canapi /接口卡类型定义 public enum pcidevicetype vci_pci5121=1, vci_pci9810=2, vci_usbcan1=3, vci_usbcan2=4, vci_pci9820=5, vci_can232=6, vci_pci5110=7, vci_canlite=8, vci_isa9620=9, vci_isa5420=10, vci_pc104can=11, vci_canete=12, vci_dnp9810=13, vci_pci9840=14, vci_pci9820i=16 /函数调用返回状
28、态值 public static readonly int status_ok=1; public static readonly int status_err=0; public enum errortype /can错误码 err_can_overflow=0x0001,/can控制器内部fifo溢出 err_can_erralarm=0x0002,/can控制器错误报警 err_can_passive=0x0004,/can控制器消极错误 err_can_lose=0x0008,/can控制器仲裁丢失 err_can_buserr=0x0010,/can控制器总线错误 /通用错误码 er
29、r_deviceopened=0x0100,/设备已经打开 err_deviceopen=0x0200,/打开设备错误 err_devicenotopen=0x0400,/设备没有打开 err_bufferoverflow=0x0800,/缓冲区溢出 err_devicenotexist=0x1000,/此设备不存在 err_loadkerneldll=0x2000,/装载动态库失败 err_cmdfailed=0x4000,/执行命令失败错误码 err_buffercreate=0x8000/内存不足 /1.zlgcan系列接口卡信息的数据类型。 structlayout(layoutkin
30、d.sequential, charset = charset.ansi) public struct vci_board_info public ushort hw_version; public ushort fw_version; public ushort dr_version; public ushort in_version; public ushort irq_num; public byte can_num; system.runtime.interopservices.marshalasattribute(system.runtime.interopservices.unma
31、nagedtype.byvaltstr, sizeconst = 20) public string str_serial_num; system.runtime.interopservices.marshalasattribute(system.runtime.interopservices.unmanagedtype.byvaltstr, sizeconst = 40) public string str_hw_type; system.runtime.interopservices.marshalasattribute(system.runtime.interopservices.unm
32、anagedtype.byvalarray, sizeconst = 4, arraysubtype = system.runtime.interopservices.unmanagedtype.u2) public ushort reserved; /2.定义can信息帧的数据类型。 structlayout(layoutkind.sequential, charset = charset.ansi) public struct vci_can_obj public uint id; public uint timestamp; public byte timeflag; public by
33、te sendtype; public byte remoteflag;/是否是远程帧 public byte externflag;/是否是扩展帧 public byte datalen; marshalas(unmanagedtype.byvalarray, sizeconst = 8, arraysubtype = unmanagedtype.i1) public byte data; marshalas(unmanagedtype.byvalarray, sizeconst = 3, arraysubtype = unmanagedtype.i1) public byte reserv
34、ed; /3.定义can控制器状态的数据类型。 structlayout(layoutkind.sequential, charset = charset.ansi) public struct vci_can_status public byte errinterrupt; public byte regmode; public byte regstatus; public byte regalcapture; public byte regeccapture; public byte regewlimit; public byte regrecounter; public byte reg
35、tecounter; public uint reserved; /4.定义错误信息的数据类型。 structlayout(layoutkind.sequential, charset = charset.ansi) public struct vci_err_info public uint errcode; system.runtime.interopservices.marshalasattribute(system.runtime.interopservices.unmanagedtype.byvalarray, sizeconst = 3, arraysubtype = system
36、.runtime.interopservices.unmanagedtype.i1) public byte passive_errdata; public byte arlost_errdata; /5.定义初始化can的数据类型 structlayout(layoutkind.sequential, charset = charset.ansi) public struct vci_init_config public uint acccode; public uint accmask; public uint reserved; public byte filter; public by
37、te timing0; public byte timing1; public byte mode; structlayout(layoutkind.sequential, charset = charset.ansi) public struct chgdesipandport system.runtime.interopservices.marshalasattribute(system.runtime.interopservices.unmanagedtype.byvaltstr, sizeconst = 10) public string szpwd; system.runtime.i
38、nteropservices.marshalasattribute(system.runtime.interopservices.unmanagedtype.byvaltstr, sizeconst = 20) public string szdesip; public int desport; #region api函数 dllimport(controlcan.dll, entrypoint = vci_opendevice, charset = charset.ansi, callingconvention = callingconvention.stdcall) public stat
39、ic extern uint vci_opendevice(uint devicetype, uint deviceind, uint reserved); dllimport(controlcan.dll, entrypoint = vci_closedevice, charset = charset.ansi, callingconvention = callingconvention.stdcall) public static extern uint vci_closedevice(uint devicetype, uint deviceind); dllimport(controlc
40、an.dll, entrypoint = vci_initcan, charset = charset.ansi, callingconvention = callingconvention.stdcall) public static extern uint vci_initcan(uint devicetype, uint deviceind, uint canind, ref vci_init_config pinitconfig); dllimport(controlcan.dll, entrypoint = vci_readboardinfo, charset = charset.a
41、nsi, callingconvention = callingconvention.stdcall) public static extern uint vci_readboardinfo(uint devicetype, uint deviceind, ref vci_board_info pinfo); dllimport(controlcan.dll, entrypoint = vci_readerrinfo, charset = charset.ansi, callingconvention = callingconvention.stdcall) public static ext
42、ern uint vci_readerrinfo(uint devicetype, uint deviceind, uint canind, ref vci_err_info perrinfo); dllimport(controlcan.dll, entrypoint = vci_readcanstatus, charset = charset.ansi, callingconvention = callingconvention.stdcall) public static extern uint vci_readcanstatus(uint devicetype, uint device
43、ind, uint canind, ref vci_can_status pcanstatus); dllimport(controlcan.dll, entrypoint = vci_getreference, charset = charset.ansi, callingconvention = callingconvention.stdcall) public static extern uint vci_getreference(uint devicetype, uint deviceind, uint canind, uint reftype, object pdata); dlli
44、mport(controlcan.dll, entrypoint = vci_setreference, charset = charset.ansi, callingconvention = callingconvention.stdcall) public static extern uint vci_setreference(uint devicetype, uint deviceind, uint canind, uint reftype, object pdata); dllimport(controlcan.dll, entrypoint = vci_getreceivenum,
45、charset = charset.ansi, callingconvention = callingconvention.stdcall) public static extern uint vci_getreceivenum(uint devicetype, uint deviceind, uint canind); dllimport(controlcan.dll, entrypoint = vci_clearbuffer, charset = charset.ansi, callingconvention = callingconvention.stdcall) public stat
46、ic extern uint vci_clearbuffer(uint devicetype, uint deviceind, uint canind); dllimport(controlcan.dll, entrypoint = vci_startcan, charset = charset.ansi, callingconvention = callingconvention.stdcall) public static extern uint vci_startcan(uint devicetype, uint deviceind, uint canind); dllimport(controlcan.dll, entrypoint = vci_resetcan, charset = charset.ansi, callingconvention = callingconvention.stdcall) public static extern uint vci_resetcan(uint devicetype, u
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 语音指令识别优化-第1篇-洞察与解读
- 雨的四季试卷及答案
- 企业文档管理标准化流程及模板
- 2023年税务师之税法一综合练习试卷A卷附答案
- 会议记录标准化模板高效版
- 文档资料归档模板与分类系统
- 小学信息技术培训工作总结
- 02公共营养师四级理论模拟试卷2及答案
- 2025年天津事业单位招聘考试综合类专业能力测试试卷(管理类)知识
- 《九年级历史冷战背景与起源教学教案》
- 房地产代建项目实施方案范文
- 《PLC应用技术(S7-1200)微课版》全套教学课件
- 法官心理健康维护实务讲座
- 《广西《肌筋膜触发点治疗技术规范》编制说明》
- 部编版一年级上册语文按课文内容填空(全册)
- 台球助教培训课件
- 2022年山东省职业院校技能大赛中职组“现代物流综合作业”赛项规程
- 2024电力检修工程预算定额使用指南
- 老人护理防压疮
- 2025年充气式假目标项目市场调查研究报告
- 幼儿园适用1-100的数字描红(可打印)
评论
0/150
提交评论