创新can调试器Linux版
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

286 lines
8.7 KiB

4 years ago
  1. //样例只是提供一个简单的调用so库的方法供参考,程序接收,与发送函数设置在两个线程中,并且线程没有同步。
  2. //现实中客户编程中,发送与接收函数不能同时调用(不支持多线程),如果在多线程中,一定需要互锁。需要客户自行完善代码。
  3. #include <stdio.h>
  4. #include <sys/types.h>
  5. #include <sys/stat.h>
  6. #include <fcntl.h>
  7. #include <pthread.h>
  8. #include "controlcan.h"
  9. #include <ctime>
  10. #include <cstdlib>
  11. #include "unistd.h"
  12. VCI_BOARD_INFO pInfo;//用来获取设备信息。
  13. int count=0;//数据列表中,用来存储列表序号。
  14. VCI_BOARD_INFO pInfo1 [50];
  15. int num=0;
  16. void *receive_func(void* param) //接收线程。
  17. {
  18. int reclen=0;
  19. VCI_CAN_OBJ rec[3000];//接收缓存,设为3000为佳。
  20. int i,j;
  21. int *run=(int*)param;//线程启动,退出控制。
  22. int ind=0;
  23. while((*run)&0x0f)
  24. {
  25. if((reclen=VCI_Receive(VCI_USBCAN2,0,ind,rec,3000,100))>0)//调用接收函数,如果有数据,进行数据处理显示。
  26. {
  27. for(j=0;j<reclen;j++)
  28. {
  29. printf("Index:%04d ",count);count++;//序号递增
  30. printf("CAN%d RX ID:0x%08X", ind+1, rec[j].ID);//ID
  31. if(rec[j].ExternFlag==0) printf(" Standard ");//帧格式:标准帧
  32. if(rec[j].ExternFlag==1) printf(" Extend ");//帧格式:扩展帧
  33. if(rec[j].RemoteFlag==0) printf(" Data ");//帧类型:数据帧
  34. if(rec[j].RemoteFlag==1) printf(" Remote ");//帧类型:远程帧
  35. printf("DLC:0x%02X",rec[j].DataLen);//帧长度
  36. printf(" data:0x"); //数据
  37. for(i = 0; i < rec[j].DataLen; i++)
  38. {
  39. printf(" %02X", rec[j].Data[i]);
  40. }
  41. printf(" TimeStamp:0x%08X",rec[j].TimeStamp);//时间标识。
  42. printf("\n");
  43. }
  44. }
  45. ind=!ind;//变换通道号,以便下次读取另一通道,交替读取。
  46. }
  47. printf("run thread exit\n");//退出接收线程
  48. pthread_exit(0);
  49. }
  50. main()
  51. {
  52. printf(">>this is hello !\r\n");//指示程序已运行
  53. num=VCI_FindUsbDevice2(pInfo1);
  54. printf(">>USBCAN DEVICE NUM:");printf("%d", num);printf(" PCS");printf("\n");
  55. for(int i=0;i<num;i++)
  56. {
  57. printf("Device:");printf("%d", i);printf("\n");
  58. printf(">>Get VCI_ReadBoardInfo success!\n");
  59. printf(">>Serial_Num:%c", pInfo1[i].str_Serial_Num[0]);
  60. printf("%c", pInfo1[i].str_Serial_Num[1]);
  61. printf("%c", pInfo1[i].str_Serial_Num[2]);
  62. printf("%c", pInfo1[i].str_Serial_Num[3]);
  63. printf("%c", pInfo1[i].str_Serial_Num[4]);
  64. printf("%c", pInfo1[i].str_Serial_Num[5]);
  65. printf("%c", pInfo1[i].str_Serial_Num[6]);
  66. printf("%c", pInfo1[i].str_Serial_Num[7]);
  67. printf("%c", pInfo1[i].str_Serial_Num[8]);
  68. printf("%c", pInfo1[i].str_Serial_Num[9]);
  69. printf("%c", pInfo1[i].str_Serial_Num[10]);
  70. printf("%c", pInfo1[i].str_Serial_Num[11]);
  71. printf("%c", pInfo1[i].str_Serial_Num[12]);
  72. printf("%c", pInfo1[i].str_Serial_Num[13]);
  73. printf("%c", pInfo1[i].str_Serial_Num[14]);
  74. printf("%c", pInfo1[i].str_Serial_Num[15]);
  75. printf("%c", pInfo1[i].str_Serial_Num[16]);
  76. printf("%c", pInfo1[i].str_Serial_Num[17]);
  77. printf("%c", pInfo1[i].str_Serial_Num[18]);
  78. printf("%c", pInfo1[i].str_Serial_Num[19]);printf("\n");
  79. printf(">>hw_Type:%c", pInfo1[i].str_hw_Type[0]);
  80. printf("%c", pInfo1[i].str_hw_Type[1]);
  81. printf("%c", pInfo1[i].str_hw_Type[2]);
  82. printf("%c", pInfo1[i].str_hw_Type[3]);
  83. printf("%c", pInfo1[i].str_hw_Type[4]);
  84. printf("%c", pInfo1[i].str_hw_Type[5]);
  85. printf("%c", pInfo1[i].str_hw_Type[6]);
  86. printf("%c", pInfo1[i].str_hw_Type[7]);
  87. printf("%c", pInfo1[i].str_hw_Type[8]);
  88. printf("%c", pInfo1[i].str_hw_Type[9]);printf("\n");
  89. printf(">>Firmware Version:V");
  90. printf("%x", (pInfo1[i].fw_Version&0xF00)>>8);
  91. printf(".");
  92. printf("%x", (pInfo1[i].fw_Version&0xF0)>>4);
  93. printf("%x", pInfo1[i].fw_Version&0xF);
  94. printf("\n");
  95. }
  96. printf(">>\n");
  97. printf(">>\n");
  98. printf(">>\n");
  99. if(VCI_OpenDevice(VCI_USBCAN2,0,0)==1)//打开设备
  100. {
  101. printf(">>open deivce success!\n");//打开设备成功
  102. }else
  103. {
  104. printf(">>open deivce error!\n");
  105. exit(1);
  106. }
  107. if(VCI_ReadBoardInfo(VCI_USBCAN2,0,&pInfo)==1)//读取设备序列号、版本等信息。
  108. {
  109. printf(">>Get VCI_ReadBoardInfo success!\n");
  110. //printf(" %08X", pInfo.hw_Version);printf("\n");
  111. //printf(" %08X", pInfo.fw_Version);printf("\n");
  112. //printf(" %08X", pInfo.dr_Version);printf("\n");
  113. //printf(" %08X", pInfo.in_Version);printf("\n");
  114. //printf(" %08X", pInfo.irq_Num);printf("\n");
  115. //printf(" %08X", pInfo.can_Num);printf("\n");
  116. printf(">>Serial_Num:%c", pInfo.str_Serial_Num[0]);
  117. printf("%c", pInfo.str_Serial_Num[1]);
  118. printf("%c", pInfo.str_Serial_Num[2]);
  119. printf("%c", pInfo.str_Serial_Num[3]);
  120. printf("%c", pInfo.str_Serial_Num[4]);
  121. printf("%c", pInfo.str_Serial_Num[5]);
  122. printf("%c", pInfo.str_Serial_Num[6]);
  123. printf("%c", pInfo.str_Serial_Num[7]);
  124. printf("%c", pInfo.str_Serial_Num[8]);
  125. printf("%c", pInfo.str_Serial_Num[9]);
  126. printf("%c", pInfo.str_Serial_Num[10]);
  127. printf("%c", pInfo.str_Serial_Num[11]);
  128. printf("%c", pInfo.str_Serial_Num[12]);
  129. printf("%c", pInfo.str_Serial_Num[13]);
  130. printf("%c", pInfo.str_Serial_Num[14]);
  131. printf("%c", pInfo.str_Serial_Num[15]);
  132. printf("%c", pInfo.str_Serial_Num[16]);
  133. printf("%c", pInfo.str_Serial_Num[17]);
  134. printf("%c", pInfo.str_Serial_Num[18]);
  135. printf("%c", pInfo.str_Serial_Num[19]);printf("\n");
  136. printf(">>hw_Type:%c", pInfo.str_hw_Type[0]);
  137. printf("%c", pInfo.str_hw_Type[1]);
  138. printf("%c", pInfo.str_hw_Type[2]);
  139. printf("%c", pInfo.str_hw_Type[3]);
  140. printf("%c", pInfo.str_hw_Type[4]);
  141. printf("%c", pInfo.str_hw_Type[5]);
  142. printf("%c", pInfo.str_hw_Type[6]);
  143. printf("%c", pInfo.str_hw_Type[7]);
  144. printf("%c", pInfo.str_hw_Type[8]);
  145. printf("%c", pInfo.str_hw_Type[9]);printf("\n");
  146. printf(">>Firmware Version:V");
  147. printf("%x", (pInfo.fw_Version&0xF00)>>8);
  148. printf(".");
  149. printf("%x", (pInfo.fw_Version&0xF0)>>4);
  150. printf("%x", pInfo.fw_Version&0xF);
  151. printf("\n");
  152. }else
  153. {
  154. printf(">>Get VCI_ReadBoardInfo error!\n");
  155. exit(1);
  156. }
  157. //初始化参数,严格参数二次开发函数库说明书。
  158. VCI_INIT_CONFIG config;
  159. config.AccCode=0;
  160. config.AccMask=0xFFFFFFFF;
  161. config.Filter=1;//接收所有帧
  162. config.Timing0=0x03;/*波特率125 Kbps 0x03 0x1C*/
  163. config.Timing1=0x1C;
  164. config.Mode=0;//正常模式
  165. if(VCI_InitCAN(VCI_USBCAN2,0,0,&config)!=1)
  166. {
  167. printf(">>Init CAN1 error\n");
  168. VCI_CloseDevice(VCI_USBCAN2,0);
  169. }
  170. if(VCI_StartCAN(VCI_USBCAN2,0,0)!=1)
  171. {
  172. printf(">>Start CAN1 error\n");
  173. VCI_CloseDevice(VCI_USBCAN2,0);
  174. }
  175. if(VCI_InitCAN(VCI_USBCAN2,0,1,&config)!=1)
  176. {
  177. printf(">>Init can2 error\n");
  178. VCI_CloseDevice(VCI_USBCAN2,0);
  179. }
  180. if(VCI_StartCAN(VCI_USBCAN2,0,1)!=1)
  181. {
  182. printf(">>Start can2 error\n");
  183. VCI_CloseDevice(VCI_USBCAN2,0);
  184. }
  185. //需要发送的帧,结构体设置
  186. VCI_CAN_OBJ send[1];
  187. send[0].ID=0;
  188. send[0].SendType=0;
  189. send[0].RemoteFlag=0;
  190. send[0].ExternFlag=1;
  191. send[0].DataLen=8;
  192. int i=0;
  193. for(i = 0; i < send[0].DataLen; i++)
  194. {
  195. send[0].Data[i] = i;
  196. }
  197. int m_run0=1;
  198. pthread_t threadid;
  199. int ret;
  200. ret=pthread_create(&threadid,NULL,receive_func,&m_run0);
  201. int times = 5;
  202. while(times--)
  203. {
  204. if(VCI_Transmit(VCI_USBCAN2, 0, 0, send, 1) == 1)
  205. {
  206. printf("Index:%04d ",count);count++;
  207. printf("CAN1 TX ID:0x%08X",send[0].ID);
  208. if(send[0].ExternFlag==0) printf(" Standard ");
  209. if(send[0].ExternFlag==1) printf(" Extend ");
  210. if(send[0].RemoteFlag==0) printf(" Data ");
  211. if(send[0].RemoteFlag==1) printf(" Remote ");
  212. printf("DLC:0x%02X",send[0].DataLen);
  213. printf(" data:0x");
  214. for(i=0;i<send[0].DataLen;i++)
  215. {
  216. printf(" %02X",send[0].Data[i]);
  217. }
  218. printf("\n");
  219. send[0].ID+=1;
  220. }
  221. else
  222. {
  223. break;
  224. }
  225. if(VCI_Transmit(VCI_USBCAN2, 0, 1, send, 1) == 1)
  226. {
  227. printf("Index:%04d ",count);count++;
  228. printf("CAN2 TX ID:0x%08X", send[0].ID);
  229. if(send[0].ExternFlag==0) printf(" Standard ");
  230. if(send[0].ExternFlag==1) printf(" Extend ");
  231. if(send[0].RemoteFlag==0) printf(" Data ");
  232. if(send[0].RemoteFlag==1) printf(" Remote ");
  233. printf("DLC:0x%02X",send[0].DataLen);
  234. printf(" data:0x");
  235. for(i = 0; i < send[0].DataLen; i++)
  236. {
  237. printf(" %02X", send[0].Data[i]);
  238. }
  239. printf("\n");
  240. send[0].ID+=1;
  241. }
  242. else break;
  243. }
  244. usleep(10000000);//延时单位us,这里设置 10 000 000=10s 10s后关闭接收线程,并退出主程序。
  245. m_run0=0;//线程关闭指令。
  246. pthread_join(threadid,NULL);//等待线程关闭。
  247. usleep(100000);//延时100ms。
  248. VCI_ResetCAN(VCI_USBCAN2, 0, 0);//复位CAN1通道。
  249. usleep(100000);//延时100ms。
  250. VCI_ResetCAN(VCI_USBCAN2, 0, 1);//复位CAN2通道。
  251. usleep(100000);//延时100ms。
  252. VCI_CloseDevice(VCI_USBCAN2,0);//关闭设备。
  253. //除收发函数外,其它的函数调用前后,最好加个毫秒级的延时,即不影响程序的运行,又可以让USBCAN设备有充分的时间处理指令。
  254. //goto ext;
  255. }