Voila, je suis d�butant en C#, et apr�s avoir fait plusieurs tentatives je viens vous demander de l'aide.
J'ai une carte APPLICOM qui g�re un r�seau CAN. Avec cette carte, le fournisseur ma donner une DLL qui permet de dialoguer avec celle ci. Je l'ai tester avec LabWindows CVI et cela fonctionne. Quand j'essaye avec C# j'ai des codes d'erreur. A priori cela viendrait du tableau de byte passer par pointeur.
Voila le fichier H :
Dans ce fichier, j'utilie la fonction AuWriteReadMsg_io.
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 #ifndef __APPLICOMIO_HEADER_FILE__ #define __APPLICOMIO_HEADER_FILE__ #include <cvidef.h> typedef unsigned short WORD; typedef unsigned char BYTE; typedef unsigned long DWORD; /* Translate a card number to a chan number */ #define CARD2CHAN(x) ((WORD)((x-1)*4)) /* Function prototype */ BOOL _stdcall AuInitBus_io (DWORD* pdwStatus); BOOL _stdcall AuExitBus_io (DWORD* pdwStatus); BOOL _stdcall AuWriteReadMsg_io (WORD wChan, WORD wNes, DWORD dwMsgParam, WORD wNbTx, BYTE* lpbyBufTx, WORD* pwNbRx, BYTE* lpbyBufRx, DWORD* pdwStatus); #endif
Voila le code en C# ( Microsoft express )
Et voici l'exemple en C qui fonctionne :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; namespace CanCSharp { unsafe public partial class Form1 : Form { int StatusInit=0; int StatusStop = 0; [DllImport("applicomio.dll")] public static extern bool AuInitBus_io(ref int StatusInit); [DllImport("applicomio.dll")] public static extern bool AuExitBus_io(ref int StatusStop); [DllImport("applicomio.dll")] public static extern bool AuWriteReadMsg_io( UInt16 wChan, uint wNes, uint dwMesParam, UInt16 wNbTx, ref byte []BufTx, ref UInt16 NbRx, ref byte []BufRx, ref uint Status); public Form1() { InitializeComponent(); } private void InitBtn_Click(object sender, EventArgs e) { bool ready = AuInitBus_io(ref StatusInit); if (ready) ErrorInit.Text = "OK"; else ErrorInit.Text = "Fault" + FunctionErrorMes(StatusInit); } private void Form1_Load(object sender, EventArgs e) { ErrorInit.Text = ""; ErrorStop.Text = ""; } private void StopBtn_Click(object sender, EventArgs e) { bool ready = AuExitBus_io(ref StatusStop); if (ready) ErrorStop.Text = "OK"; else ErrorStop.Text = "Fault" + FunctionErrorMes(StatusStop); } private string FunctionErrorMes(int CodeErr) { if (CodeErr == 0) return ""; if (CodeErr == 4) return " = Code ID déja utilisé ou erreur émission"; if (CodeErr == 32) return " = Paramêtre non OK (trop long ou trop court)"; if (CodeErr == 33) return " = Erreur Time Out"; if (CodeErr == 36) return " = Equipement non configuré"; if (CodeErr == 45) return " = Faire un init carte applicom"; if (CodeErr == 47) return " = Carte Applicom non valide"; if (CodeErr == 63) return "Erreur de communication"; if (CodeErr == 66) return "Mémoire de la carte Applicom insuffisante"; if (CodeErr == 93) return " = Driver inaccéssible"; if (CodeErr == 99) return " = DLL applicomIO en cours d'utilisation"; return " = Erreur inconnue"; } public void SendBtn_Click(object sender, EventArgs e) { UInt16 wChan = 0; uint wNes = 1; uint dwMesParam = 0x180; UInt16 wNbTx = 5; byte [] BufTx; UInt16 NbRx = 0; byte [] BufRx; uint Status = 0; BufTx = new byte[5]; BufTx[0] = 0x08; BufTx[1] =0x00; BufTx[2] =0x00; BufTx[3] =0x00; BufTx[4] =0x00; BufRx = new byte[1]; BufRx[0] = 0x00; bool ready = AuWriteReadMsg_io (wChan,wNes,dwMesParam,wNbTx,ref BufTx,ref NbRx, ref BufRx,ref Status); if (ready) ErrorSend.Text = "OK"; else ErrorSend.Text = "Fault" + FunctionErrorMes((int)Status); } } }
Lorsque je compile cette source cela ne g�n�re pas d'�rreur,mais ca marche pas Erreur 32 (Mauvais param�trage)
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 void __declspec(dllexport) TX_TEST RunNCSCardsInNormalMode(tTestData *testData, tTestError *testError) { int error = 0; ErrMsg errMsg = {'\0'}; ERRORINFO errorInfo; BOOL Result = FALSE; BYTE BufRx = 0; WORD NbRx = 0; BYTE BufTx[5] = {0x08,0x00,0x00,0x00,0x00}; WORD NbTx = 5; DWORD MsgParam = 0x180; WORD Nes = 1; WORD Chan = 0; BufTx[3] = 0x00; AuWriteReadMsg_io (Chan, Nes, MsgParam, NbTx, BufTx,&NbRx, &BufRx, &error); Sleep(200); BufTx[3] = 0x02; AuWriteReadMsg_io (Chan, Nes, MsgParam, NbTx, BufTx,&NbRx, &BufRx, &error); Error: // If an error occurred, set the error flag to cause a run-time error in TestStand. if (error != 0) { testError->errorFlag = TRUE; // OPTIONALLY SET THE ERROR CODE AND STRING testError->errorCode = error; testData->replaceStringFuncPtr(&testError->errorMessage, errMsg); } return; }
Lorsque je modifie le prototype de la fonction en mettant des pointeurs (comme en C), il n'arrive pas � li� le pointeur avec le tableau de byte. Donc si vous avez quelques pistes � exploiter, je suis prenneur![]()
Partager