创新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.

522 lines
16 KiB

4 years ago
  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #pragma hdrstop
  4. #include "Unit1.h"
  5. //---------------------------------------------------------------------------
  6. #pragma package(smart_init)
  7. #pragma resource "*.dfm"
  8. TForm1 *Form1;
  9. /*
  10. Ǿĵö̬õǶ̬صķҪڳʼ
  11. ʱӶ̬ȡøĵַȻҪʱþͿˣ
  12. ˳ʱͷŵ򿪵Ķ̬С
  13. */
  14. /*---------------------------����ZLG���������------------------------------*/
  15. //���ȶ�����Ҫ�õ������ݽṹ
  16. //USB-CAN�����������忨��Ϣ���������͡�
  17. typedef struct _VCI_BOARD_INFO{
  18. USHORT hw_Version;
  19. USHORT fw_Version;
  20. USHORT dr_Version;
  21. USHORT in_Version;
  22. USHORT irq_Num;
  23. BYTE can_Num;
  24. CHAR str_Serial_Num[20];
  25. CHAR str_hw_Type[40];
  26. USHORT Reserved[4];
  27. } VCI_BOARD_INFO,*PVCI_BOARD_INFO;
  28. //����CAN��Ϣ֡���������͡�
  29. typedef struct _VCI_CAN_OBJ{
  30. UINT ID;
  31. UINT TimeStamp; //ʱ����ʶ
  32. BYTE TimeFlag; //�Ƿ�ʹ��ʱ����ʶ
  33. BYTE SendType; //���ͱ�־��������δ��
  34. BYTE RemoteFlag; //�Ƿ���Զ��֡
  35. BYTE ExternFlag; //�Ƿ�����չ֡
  36. BYTE DataLen;
  37. BYTE Data[8];
  38. BYTE Reserved[3]; //����
  39. }VCI_CAN_OBJ,*PVCI_CAN_OBJ;
  40. //����CAN������״̬���������͡�
  41. typedef struct _VCI_CAN_STATUS{
  42. UCHAR ErrInterrupt;
  43. UCHAR regMode;
  44. UCHAR regStatus;
  45. UCHAR regALCapture;
  46. UCHAR regECCapture;
  47. UCHAR regEWLimit;
  48. UCHAR regRECounter;
  49. UCHAR regTECounter;
  50. DWORD Reserved;
  51. }VCI_CAN_STATUS,*PVCI_CAN_STATUS;
  52. //����������Ϣ���������͡�
  53. typedef struct _ERR_INFO{
  54. UINT ErrCode;
  55. BYTE Passive_ErrData[3];
  56. BYTE ArLost_ErrData;
  57. } VCI_ERR_INFO,*PVCI_ERR_INFO;
  58. //������ʼ��CAN����������
  59. typedef struct _INIT_CONFIG{
  60. DWORD AccCode;
  61. DWORD AccMask;
  62. DWORD InitFlag;
  63. UCHAR Filter; //0,1��������֡��2��׼֡�˲���3����չ֡�˲���
  64. UCHAR Timing0;
  65. UCHAR Timing1;
  66. UCHAR Mode; //ģʽ��0��ʾ����ģʽ��1��ʾֻ��ģʽ,2�Բ�ģʽ
  67. }VCI_INIT_CONFIG,*PVCI_INIT_CONFIG;
  68. //����������Ҫ�����ĺ�������
  69. //����ControlCAN.h�еĺ����������庯��ָ������
  70. //////////////////////////////////////////////////////////////////////////
  71. //����ZLG���
  72. typedef DWORD (CALLBACK* LPVCI_OpenDevice)(DWORD,DWORD,DWORD);
  73. typedef DWORD (CALLBACK* LPVCI_CloseDevice)(DWORD,DWORD);
  74. typedef DWORD (CALLBACK* LPVCI_InitCan)(DWORD,DWORD,DWORD,PVCI_INIT_CONFIG);
  75. typedef DWORD (CALLBACK* LPVCI_ReadBoardInfo)(DWORD,DWORD,PVCI_BOARD_INFO);
  76. typedef DWORD (CALLBACK* LPVCI_ReadErrInfo)(DWORD,DWORD,DWORD,PVCI_ERR_INFO);
  77. typedef DWORD (CALLBACK* LPVCI_ReadCanStatus)(DWORD,DWORD,DWORD,PVCI_CAN_STATUS);
  78. typedef DWORD (CALLBACK* LPVCI_GetReference)(DWORD,DWORD,DWORD,DWORD,PVOID);
  79. typedef DWORD (CALLBACK* LPVCI_SetReference)(DWORD,DWORD,DWORD,DWORD,PVOID);
  80. typedef ULONG (CALLBACK* LPVCI_GetReceiveNum)(DWORD,DWORD,DWORD);
  81. typedef DWORD (CALLBACK* LPVCI_ClearBuffer)(DWORD,DWORD,DWORD);
  82. typedef DWORD (CALLBACK* LPVCI_StartCAN)(DWORD,DWORD,DWORD);
  83. typedef DWORD (CALLBACK* LPVCI_ResetCAN)(DWORD,DWORD,DWORD);
  84. typedef ULONG (CALLBACK* LPVCI_Transmit)(DWORD,DWORD,DWORD,PVCI_CAN_OBJ,ULONG);
  85. typedef ULONG (CALLBACK* LPVCI_Receive)(DWORD,DWORD,DWORD,PVCI_CAN_OBJ,ULONG,INT);
  86. /*-------------------------����������������������-----------------------------*/
  87. //���ȶ�����Ҫ�õ������ݽṹ
  88. //USB-CAN�����������忨��Ϣ���������ͣ���������VCI_FindUsbDevice���������á�
  89. typedef struct _VCI_BOARD_INFO1{
  90. USHORT hw_Version;
  91. USHORT fw_Version;
  92. USHORT dr_Version;
  93. USHORT in_Version;
  94. USHORT irq_Num;
  95. BYTE can_Num;
  96. BYTE reserved;
  97. CHAR str_Serial_Num[8];
  98. CHAR str_hw_Type[16];
  99. CHAR str_USB_Serial[4][4];
  100. } VCI_BOARD_INFO1,*PVCI_BOARD_INFO1;
  101. //���峣����������
  102. typedef struct _REF_NORMAL{
  103. BYTE Mode; //����ģʽ
  104. BYTE Filter; //�˲���ʽ
  105. DWORD AccCode; //�����˲�������
  106. DWORD AccMask; //�����˲�������
  107. BYTE kBaudRate; //�����������ţ�0-SelfDefine,1-5Kbps(δ��),2-18����Ϊ��10kbps,20kbps,40kbps,50kbps,80kbps,100kbps,125kbps,200kbps,250kbps,400kbps,500kbps,666kbps,800kbps,1000kbps,33.33kbps,66.66kbps,83.33kbps
  108. BYTE Timing0;
  109. BYTE Timing1;
  110. BYTE CANRX_EN; //�������
  111. BYTE UARTBAUD; //�������
  112. }VCI_REF_NORMAL,*PVCI_REF_NORMAL;
  113. //���岨�������ò�������
  114. typedef struct _BAUD_TYPE{
  115. DWORD Baud; //�洢������ʵ��ֵ
  116. BYTE SJW; //ͬ����ת���ȣ�ȡֵ1-4
  117. BYTE BRP; //Ԥ��Ƶֵ��ȡֵ1-64
  118. BYTE SAM; //�����㣬ȡֵ0=����һ�Σ�1=��������
  119. BYTE PHSEG2_SEL; //��λ������2ѡ��λ��ȡֵ0=����λ������1ʱ������,1=�ɱ���
  120. BYTE PRSEG; //����ʱ���Σ�ȡֵ1-8
  121. BYTE PHSEG1; //��λ������1��ȡֵ1-8
  122. BYTE PHSEG2; //��λ������2��ȡֵ1-8
  123. }VCI_BAUD_TYPE,*PVCI_BAUD_TYPE;
  124. //����Reference��������
  125. typedef struct _REF_STRUCT{
  126. VCI_REF_NORMAL RefNormal;
  127. BYTE Reserved;
  128. VCI_BAUD_TYPE BaudType;
  129. }VCI_REF_STRUCT,*PVCI_REF_STRUCT;
  130. //��������
  131. typedef DWORD (CALLBACK* LPVCI_GetReference2)(DWORD,DWORD,DWORD,DWORD,PVCI_REF_STRUCT);
  132. typedef DWORD (CALLBACK* LPVCI_SetReference2)(DWORD,DWORD,DWORD,DWORD,PVOID);
  133. typedef DWORD (CALLBACK* LPVCI_ResumeConfig)(DWORD,DWORD,DWORD);
  134. typedef DWORD (CALLBACK* LPVCI_ConnectDevice)(DWORD,DWORD);
  135. typedef DWORD (CALLBACK* LPVCI_UsbDeviceReset)(DWORD,DWORD,DWORD);
  136. typedef DWORD (CALLBACK* LPVCI_FindUsbDevice)(PVCI_BOARD_INFO1);
  137. //////////////////////////////////////////////////////////////////////////
  138. HANDLE m_hDLL;//���������򿪵Ķ�̬������
  139. //�ӿں���ָ��
  140. LPVCI_OpenDevice VCI_OpenDevice;
  141. LPVCI_CloseDevice VCI_CloseDevice;
  142. LPVCI_InitCan VCI_InitCAN;
  143. LPVCI_ReadBoardInfo VCI_ReadBoardInfo;
  144. LPVCI_ReadErrInfo VCI_ReadErrInfo;
  145. LPVCI_ReadCanStatus VCI_ReadCanStatus;
  146. LPVCI_GetReference VCI_GetReference;
  147. LPVCI_SetReference VCI_SetReference;
  148. LPVCI_GetReceiveNum VCI_GetReceiveNum;
  149. LPVCI_ClearBuffer VCI_ClearBuffer;
  150. LPVCI_StartCAN VCI_StartCAN;
  151. LPVCI_ResetCAN VCI_ResetCAN;
  152. LPVCI_Transmit VCI_Transmit;
  153. LPVCI_Receive VCI_Receive;
  154. LPVCI_GetReference2 VCI_GetReference2;
  155. LPVCI_SetReference2 VCI_SetReference2;
  156. LPVCI_ResumeConfig VCI_ResumeConfig;
  157. LPVCI_ConnectDevice VCI_ConnectDevice;
  158. LPVCI_UsbDeviceReset VCI_UsbDeviceReset;
  159. LPVCI_FindUsbDevice VCI_FindUsbDevice;
  160. ////////////////////////////////////////////////////////////////////////////
  161. DWORD m_devtype=4;//USBCAN2���ͺ�
  162. DWORD m_devind=0;
  163. DWORD m_cannum=0;
  164. int m_connect=0;
  165. //---------------------------------------------------------------------------
  166. __fastcall TForm1::TForm1(TComponent* Owner)
  167. : TForm(Owner)
  168. {
  169. m_hDLL = LoadLibrary("ControlCAN.dll");//�򿪶�̬��
  170. //ȡ�ú�����ַ
  171. VCI_OpenDevice=(LPVCI_OpenDevice)GetProcAddress(m_hDLL,"VCI_OpenDevice");
  172. VCI_CloseDevice=(LPVCI_CloseDevice)GetProcAddress(m_hDLL,"VCI_CloseDevice");
  173. VCI_InitCAN=(LPVCI_InitCan)GetProcAddress(m_hDLL,"VCI_InitCAN");
  174. VCI_ReadBoardInfo=(LPVCI_ReadBoardInfo)GetProcAddress(m_hDLL,"VCI_ReadBoardInfo");
  175. VCI_ReadErrInfo=(LPVCI_ReadErrInfo)GetProcAddress(m_hDLL,"VCI_ReadErrInfo");
  176. VCI_ReadCanStatus=(LPVCI_ReadCanStatus)GetProcAddress(m_hDLL,"VCI_ReadCANStatus");
  177. VCI_GetReference=(LPVCI_GetReference)GetProcAddress(m_hDLL,"VCI_GetReference");
  178. VCI_SetReference=(LPVCI_SetReference)GetProcAddress(m_hDLL,"VCI_SetReference");
  179. VCI_GetReceiveNum=(LPVCI_GetReceiveNum)GetProcAddress(m_hDLL,"VCI_GetReceiveNum");
  180. VCI_ClearBuffer=(LPVCI_ClearBuffer)GetProcAddress(m_hDLL,"VCI_ClearBuffer");
  181. VCI_StartCAN=(LPVCI_StartCAN)GetProcAddress(m_hDLL,"VCI_StartCAN");
  182. VCI_ResetCAN=(LPVCI_ResetCAN)GetProcAddress(m_hDLL,"VCI_ResetCAN");
  183. VCI_Transmit=(LPVCI_Transmit)GetProcAddress(m_hDLL,"VCI_Transmit");
  184. VCI_Receive=(LPVCI_Receive)GetProcAddress(m_hDLL,"VCI_Receive");
  185. VCI_GetReference2=(LPVCI_GetReference2)GetProcAddress(m_hDLL,"VCI_GetReference2");
  186. VCI_SetReference2=(LPVCI_SetReference2)GetProcAddress(m_hDLL,"VCI_SetReference2");
  187. VCI_ResumeConfig=(LPVCI_ResumeConfig)GetProcAddress(m_hDLL,"VCI_ResumeConfig");
  188. VCI_ConnectDevice=(LPVCI_ConnectDevice)GetProcAddress(m_hDLL,"VCI_ConnectDevice");
  189. VCI_UsbDeviceReset=(LPVCI_UsbDeviceReset)GetProcAddress(m_hDLL,"VCI_UsbDeviceReset");
  190. }
  191. void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
  192. {
  193. if(m_connect==1)
  194. {
  195. m_connect=0;
  196. WaitForSingleObject(m_readhandle,2000);
  197. m_readhandle=NULL;
  198. VCI_CloseDevice(m_devtype,m_devind);
  199. }
  200. FreeLibrary(m_hDLL);//�ͷŶ�̬������
  201. }
  202. void __fastcall TForm1::EnableUI(BOOL bEnable)
  203. {
  204. Label8->Enabled = bEnable;
  205. ComboBox1->Enabled = bEnable;
  206. Label9->Enabled = bEnable;
  207. ComboBox2->Enabled = bEnable;
  208. Label1->Enabled = bEnable;
  209. Edit2->Enabled = bEnable;
  210. Label2->Enabled = bEnable;
  211. Edit3->Enabled = bEnable;
  212. Label12->Enabled = bEnable;
  213. ComboBox3->Enabled = bEnable;
  214. Label13->Enabled = bEnable;
  215. ComboBox4->Enabled = bEnable;
  216. Label10->Enabled = bEnable;
  217. Edit5->Enabled = bEnable;
  218. Label11->Enabled = bEnable;
  219. Edit6->Enabled = bEnable;
  220. }
  221. //---------------------------------------------------------------------------
  222. void ReceiveThread(void *param)
  223. {
  224. TListBox *box=(TListBox*)param;
  225. VCI_CAN_OBJ receivedata[2500];
  226. VCI_ERR_INFO errinfo;
  227. int len,i;
  228. AnsiString str,tmpstr;
  229. while(1)
  230. {
  231. if(m_connect==0)
  232. break;
  233. Sleep(1);
  234. len=VCI_Receive(m_devtype,m_devind,m_cannum,receivedata,2500,200);
  235. if(len<=0)
  236. {
  237. }
  238. else
  239. {
  240. for(i=0;i<len;i++)
  241. {
  242. str="���յ�����֡: ";
  243. if(receivedata[i].TimeFlag==0)
  244. tmpstr="ʱ����ʶ:�� ";
  245. else
  246. tmpstr="ʱ����ʶ:0x"+IntToHex((int)receivedata[i].TimeStamp,1)+" ";
  247. str+=tmpstr;
  248. tmpstr="֡ID:0x"+IntToHex((int)receivedata[i].ID,1)+" ";
  249. str+=tmpstr;
  250. str+="֡��ʽ:";
  251. if(receivedata[i].RemoteFlag==0)
  252. tmpstr="����֡ ";
  253. else
  254. tmpstr="Զ��֡ ";
  255. str+=tmpstr;
  256. str+="֡����:";
  257. if(receivedata[i].ExternFlag==0)
  258. tmpstr="��׼֡ ";
  259. else
  260. tmpstr="��չ֡ ";
  261. str+=tmpstr;
  262. box->Items->Add(str);
  263. if(receivedata[i].RemoteFlag==0)
  264. {
  265. str="����:";
  266. if(receivedata[i].DataLen>8)
  267. receivedata[i].DataLen=8;
  268. for(int j=0;j<receivedata[i].DataLen;j++)
  269. {
  270. tmpstr=IntToHex((int)receivedata[i].Data[j],2)+" ";
  271. str+=tmpstr;
  272. }
  273. box->Items->Add(str);
  274. }
  275. }
  276. box->ItemIndex=box->Items->Count-1;
  277. }
  278. }
  279. _endthread();
  280. }
  281. void __fastcall TForm1::Button1Click(TObject *Sender)
  282. {
  283. if(m_connect==1)
  284. {
  285. Button1->Caption ="����";
  286. m_connect=0;
  287. WaitForSingleObject(m_readhandle,2000);
  288. m_readhandle=NULL;
  289. VCI_CloseDevice(m_devtype,m_devind);
  290. EnableUI(TRUE);
  291. return;
  292. }
  293. int index = 0;
  294. int cannum = ComboBox2->ItemIndex;
  295. VCI_INIT_CONFIG initconfig;
  296. initconfig.AccCode=StrToInt("0x"+Edit2->Text);
  297. initconfig.AccMask=StrToInt("0x"+Edit3->Text);
  298. initconfig.Timing0=StrToInt("0x"+Edit5->Text);
  299. initconfig.Timing1=StrToInt("0x"+Edit6->Text);
  300. initconfig.Filter=ComboBox3->ItemIndex;
  301. initconfig.Mode=ComboBox4->ItemIndex;
  302. if(index>=0&&cannum>=0)
  303. {
  304. if(VCI_OpenDevice(m_devtype,index,0)==1)
  305. {
  306. if(VCI_InitCAN(m_devtype,index,cannum,&initconfig)==1)
  307. {
  308. Button1->Caption ="�Ͽ�";
  309. m_connect=1;
  310. m_devind=0;
  311. m_cannum=cannum;
  312. m_readhandle=(HANDLE)_beginthread(ReceiveThread,0,(void*)ListBox1);
  313. }
  314. else
  315. {
  316. ShowMessage("��ʼ��CAN����");
  317. }
  318. }
  319. else
  320. {
  321. ShowMessage("�򿪶˿ڴ���");
  322. }
  323. }
  324. EnableUI(FALSE);
  325. }
  326. //---------------------------------------------------------------------------
  327. void __fastcall TForm1::Button2Click(TObject *Sender)
  328. {
  329. if(m_connect==0)
  330. {
  331. ShowMessage("���ȴ򿪶˿�");
  332. return;
  333. }
  334. if(VCI_ResetCAN(m_devtype,m_devind,m_cannum)==1)
  335. {
  336. ListBox1->Items->Add("��λCAN�ɹ�");
  337. Button4->Enabled = FALSE;
  338. }
  339. else
  340. {
  341. ListBox1->Items->Add("��λCANʧ��");
  342. }
  343. ListBox1->ItemIndex=ListBox1->Items->Count-1;
  344. }
  345. //---------------------------------------------------------------------------
  346. void __fastcall TForm1::Button3Click(TObject *Sender)
  347. {
  348. if(m_connect==0)
  349. {
  350. ShowMessage("���ȴ򿪶˿�");
  351. return;
  352. }
  353. if(VCI_StartCAN(m_devtype,m_devind,m_cannum)==1)
  354. {
  355. ListBox1->Items->Add("����CAN�ɹ�");
  356. Button4->Enabled = TRUE;
  357. }
  358. else
  359. {
  360. ListBox1->Items->Add("����CANʧ��");
  361. }
  362. ListBox1->ItemIndex=ListBox1->Items->Count-1;
  363. }
  364. //---------------------------------------------------------------------------
  365. void __fastcall TForm1::Button6Click(TObject *Sender)
  366. {
  367. if(m_connect==0)
  368. {
  369. ShowMessage("���ȴ򿪶˿�");
  370. return;
  371. }
  372. DWORD i= ComboBox3->ItemIndex;
  373. if(VCI_SetReference(m_devtype,m_devind,0,1,(PVOID)&i)==1)
  374. {
  375. ListBox1->Items->Add("���ijɹ�");
  376. }
  377. else
  378. {
  379. ListBox1->Items->Add("����ʧ��");
  380. }
  381. }
  382. //---------------------------------------------------------------------------
  383. void __fastcall TForm1::FormCreate(TObject *Sender)
  384. {
  385. ComboBox1->ItemIndex = 1;
  386. ComboBox2->ItemIndex = 0;
  387. ComboBox3->ItemIndex = 0;
  388. ComboBox4->ItemIndex = 0;
  389. ComboBox6->ItemIndex =0;
  390. ComboBox7->ItemIndex =0;
  391. EnableUI(TRUE);
  392. Button4->Enabled = FALSE;
  393. }
  394. //---------------------------------------------------------------------------
  395. //---------------------------------------------------------------------------
  396. //---------------------------------------------------------------------------
  397. void __fastcall TForm1::Button4Click(TObject *Sender)
  398. {
  399. if(m_connect==0)
  400. {
  401. ShowMessage("���ȴ򿪶˿�");
  402. return;
  403. }
  404. BYTE sendtype,frametype,frameformat;
  405. DWORD id;
  406. BYTE data[8];
  407. frametype=ComboBox6->ItemIndex;
  408. frameformat=ComboBox7->ItemIndex;
  409. id=StrToInt("0x"+Edit1->Text);
  410. AnsiString str=Edit4->Text;
  411. AnsiString strdata;
  412. int i,kkk;
  413. for(i=0;i<8;i++)
  414. {
  415. strdata=str.SubString(3*i+1,2);
  416. strdata=strdata.Trim();
  417. kkk=strdata.Length();
  418. if(kkk==0)
  419. {
  420. goto exit;
  421. }
  422. data[i]=StrToInt(strdata);
  423. //sscanf(strdata.c_str(),"%x",data+i);
  424. }
  425. exit:
  426. VCI_CAN_OBJ senddata;
  427. senddata.SendType=sendtype;
  428. senddata.ExternFlag=frametype;
  429. senddata.RemoteFlag=frameformat;
  430. senddata.ID=id;
  431. senddata.DataLen=i;
  432. memcpy(senddata.Data,data,i);
  433. if(VCI_Transmit(m_devtype,m_devind,m_cannum,&senddata,1)==1)
  434. {
  435. ListBox1->Items->Add("���ͳɹ�");
  436. }
  437. else
  438. {
  439. ListBox1->Items->Add("����ʧ��");
  440. }
  441. ListBox1->ItemIndex=ListBox1->Items->Count-1;
  442. }
  443. //---------------------------------------------------------------------------
  444. void __fastcall TForm1::ComboBox1Click(TObject *Sender)
  445. {
  446. m_devtype = ComboBox1->ItemIndex + 3;
  447. if( m_devtype == 3 && ComboBox2->ItemIndex > 0)
  448. {
  449. ComboBox2->ItemIndex = 0;
  450. m_cannum = 0;
  451. }
  452. }
  453. //---------------------------------------------------------------------------
  454. void __fastcall TForm1::ComboBox2Click(TObject *Sender)
  455. {
  456. if( m_devtype == 3 && ComboBox2->ItemIndex > 0 )
  457. ComboBox2->ItemIndex = 0;
  458. m_cannum = ComboBox2->ItemIndex;
  459. }
  460. //---------------------------------------------------------------------------
  461. void __fastcall TForm1::Button5Click(TObject *Sender)
  462. {
  463. ListBox1->Clear();
  464. }
  465. //---------------------------------------------------------------------------