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