Hallo zusammen,
ich möchte zwei separate CAN Threads. Einer zum Empfang von CAN-Nachrichten
und einer zum Senden von CAN-Nachrichten. Separat deshalb, damit ich
den SendeThread mit einer höheren Priorität laufen lassen kann.
Könnt Ihr mal prüfen, warum ich beim SendeThread trotzdem noch
CANBUS_EVENT_RECEIVED bekomme ???
...Code Schnipsel....
Code
- _h_rxCan = unsafe_CreateFile(ptr, GENERIC_READ, 0, null, OPEN_EXISTING, 0, null);
- _h_txCan = unsafe_CreateFile(ptr, GENERIC_WRITE, 0, null, OPEN_EXISTING, 0, null);
- _unsafe_SetCommMask(_h_rxCan, (UInt32)(t_canbus_events.CANBUS_EVENT_RECEIVED |
- t_canbus_events.CANBUS_EVENT_BUS_ERROR));
- _unsafe_SetCommMask(_h_txCan, (UInt32)(t_canbus_events.CANBUS_EVENT_TRANSMITTED |
- t_canbus_events.CANBUS_EVENT_BUS_ERROR));
- thr_rxCan = new Thread(new ThreadStart(_thr_func_rxCan));
- thr_txCan = new Thread(new ThreadStart(_thr_func_txCan));
- private void _thr_func_txCan() {
- UInt32 dw;
- try {
- while (!f_thrStop) {
- unsafe {
- if (_h_txCan != null) {
- _doTx();
- _unsafe_WaitCommEvent(_h_txCan, &dw, null);
- }// if(_h_txCan != null)
- }//unsafe
- }// while (!f_thrStop)
- }// try
- private void _thr_func_rxCan(){
- UInt32 dw;
- try
- {
- while (!f_thrStop){
- unsafe
- {
- if (_h_rxCan != null){
- _doRx();
- _unsafe_WaitCommEvent(_h_rxCan, &dw, null);
- }// if(_hCan != null)
- }//unsafe
- }// while (!f_thrStop)
- private unsafe void _doRx() {
- bool f_events_available = true;
- tagCAN_EVENT eventCan = new tagCAN_EVENT();
- tagCANMSG pMsg = new tagCANMSG();
- UInt32 dw;
- while (f_events_available){
- if (_unsafe_readCanEvent(_h_rxCan, &eventCan, &dw)){
- Debug.WriteLine("Rxevent = 0x" + eventCan.ievent.ToString("X4"));
- switch (eventCan.ievent) {
- case (UInt32)t_canbus_events.CANBUS_EVENT_RECEIVED:
- break;
- case (UInt32)t_canbus_events.CANBUS_EVENT_BUS_ERROR:
- break;
- default:
- break;
- }// switch (eventCan.ievent)
- }// if (_unsafe_readCanEvent(_h_rxCan, &eventCan, &dw))
- else
- {
- if (Marshal.GetLastWin32Error() == ERROR_NO_MORE_ITEMS) {
- f_events_available = false;
- }
- }
- }
- private unsafe void _doTx() {
- bool f_events_available = true;
- tagCAN_EVENT eventCan = new tagCAN_EVENT();
- tagCANMSG msgCan = new tagCANMSG();
- UInt32 dw;
- int err;
- while (f_events_available) {
- if (_unsafe_readCanEvent(_h_txCan, &eventCan, &dw)) {
- Debug.WriteLine("Txevent = 0x" + eventCan.ievent.ToString("X4"));
- switch (eventCan.ievent) {
- case (UInt32)t_canbus_events.CANBUS_EVENT_TRANSMITTED:
- break;
- case (UInt32)t_canbus_events.CANBUS_EVENT_BUS_ERROR:
- break;
- default:
- break;
- }// switch (eventCan.ievent)
- }
- else {
- err = Marshal.GetLastWin32Error();
- if (err == ERROR_NO_MORE_ITEMS) {
- f_events_available = false;
- }
- else {
- Debug.WriteLine("err = 0x" + err.ToString("X4"));
- }
- }
- }// while (f_events_available)
- }
mit Hilfe von Debug.WriteLine gebe ich den Event aus !
Vielen Dank