Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C#/c++] SerialPort en MSComm klasses

Pagina: 1
Acties:

  • VO-Zephyr
  • Registratie: Mei 2001
  • Laatst online: 28-03-2024
ik wil via een com poort een blackbox benaderen in de auto zodat ik (op termijn) met mijn pda de gegevens kan uitlezen (gps en datalog en alles).
Ik gebruik een dll die communicatie regelt tussen mijn lappie en de blackbox.De bedoeling is dat alles onder C# gaat draaien.
Nou heb ik 2 dingen geprobeerd, met de SerialPort klasse uit C# en een wrapper om MSComm te gebruiken.
Deze dll verwacht een 'handle' naar de com-poort volgens de API, die MSComm afgeeft met MSComm.CommID (krijg ik ergens getallen tussen de 910 en 930).
code:
1
2
Function Protocols
C-API   BOOL FM_Comms_Start (DWORD* pdwHandle)



Ik heb de DLL geimport met:
C#:
1
2
[DllImport("FM_Comms.dll")]
public static extern bool FM_Comms_Start(ref Int32 pdwHandle);

Poging 1:
Ik gebruik een wrapper voor MSComm ( en wel DesktopSerialIO.dll) omdat ik de orginele MSComm32 niet in geladen krijg.

C#:
1
2
3
4
5
6
SerialPort port = new SerialPort(1, 9600, "N", 8, 1.0f);
port.PortOpen = true;

bool test = false;
Int32 pHandle = (Int32)port.CommID;
test = FM_Comms.FM_Comms_Start(ref pHandle);

Maar in mijn comport logger gaat alleen de poort open door de MSComm wrapper en er wordt niets naar de poort geschreven of gelezen.

Poging2:
Ik gebruik de SerialPort klasse (netter in mijn ogen), maar dan weet ik niet hoe ik de goede ''handle" terugkrijg.
C#:
1
2
3
SerialPort port = new SerialPort("COM1",9600,Parity.None,8,StopBits.One);
Int32 handle = Int32.Parse("928"); //wat moet hier eigenlijk in dan...
 test = FM_Comms.FM_Comms_Start(ref handle);

Gebeurt ook niets (uiteraard).

Dit is een stukje VB uit de api om een idee te krijgen:

Visual Basic .NET:
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
Private Sub cmdStart_Click()
    Dim lState As Long
    Dim lDown As Long
    Dim lSize As Long
    cmdStart.Enabled = False
    MSComm1.Settings = "19200,N,8,1"
    MSComm1.Handshaking = comRTS 'Hardware handshaking required
    MSComm1.CommPort = 1 'assumes COM 1 -- change this as needed
    MSComm1.PortOpen = True

    FM_Comms_Start MSComm1.CommID

    Do
        FM_Comms_GetProgress lState, lDown, lSize
        lblStatus.Caption = FMCommsState(lState)
        Sleep 63 ' at least 1 / 16 secs and generally not more than 1/4 secs
        DoEvents
    Loop While lState >= &H10 Or lState = 0 'FM_COMMS_STATE_IDLE

    If lState = FM_COMMS_STATE_ERROR Then
        MsgBox FMCommsError(FM_Comms_GetLastError)
    Else
        MsgBox "Vehicle #" & FM_Comms_GetVehicleID & ": Hello World!"
    End If

    FM_Comms_End

    MSComm1.PortOpen = False
    cmdStart.Enabled = True
End Sub


iemand die me kan helpen?

  • j_du_pee
  • Registratie: Maart 2000
  • Laatst online: 23-09-2024

j_du_pee

du pain, du vin, du pee

Ik weet niet zeker of ik wel precies snap wat je vraag is... Maar goed, een klein stukje code van hoe ik connectie maak met mijn GPS vanuit mijn applicatie op mijn windows mobile omgeving:
C#:
1
2
3
4
sp = new System.IO.Ports.SerialPort(ComPort); //ComPort = b.v. "COM6"
sp.ReadTimeout = 60 * 1000;
sp.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(sp_DataReceived);
sp.Open();


Je schrijft overigens dat je nu op je laptop werkt en over wilt stappen naar je PDA. Ik zou nu alvalst bouwen voor het compact framework. Een hoop features van .net bestaan niet op dat platform en het zou zonde zijn als je daar te laat achter komt ;)

kaart != map && bottel != fles
Wacht op antwoord


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-11 18:33
Onder Win32 open je de poort met CreateFile, ik vermoed dat de API die filehandle wil hebben. Wat ik wel vreemd vind is dat ie als pointer moet worden doorgegeven, dat suggereert weer dat de API deze handle wil aanpassen( creeren ).

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • VO-Zephyr
  • Registratie: Mei 2001
  • Laatst online: 28-03-2024
j_du_pee schreef op woensdag 06 februari 2008 @ 23:50:
Ik weet niet zeker of ik wel precies snap wat je vraag is... Maar goed, een klein stukje code van hoe ik connectie maak met mijn GPS vanuit mijn applicatie op mijn windows mobile omgeving:
C#:
1
2
3
4
sp = new System.IO.Ports.SerialPort(ComPort); //ComPort = b.v. "COM6"
sp.ReadTimeout = 60 * 1000;
sp.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(sp_DataReceived);
sp.Open();


Je schrijft overigens dat je nu op je laptop werkt en over wilt stappen naar je PDA. Ik zou nu alvalst bouwen voor het compact framework. Een hoop features van .net bestaan niet op dat platform en het zou zonde zijn als je daar te laat achter komt ;)
Dat is een goede tip :) In principe hoef ik alleen met dat apparaatje te praten, en een app te schrijven die al die data uitleest die het apparaat binnenkrijgt. Zou dit een probleem zijn, of kan ik beter terug/naar C++ ?

  • VO-Zephyr
  • Registratie: Mei 2001
  • Laatst online: 28-03-2024
farlane schreef op donderdag 07 februari 2008 @ 00:07:
Onder Win32 open je de poort met CreateFile, ik vermoed dat de API die filehandle wil hebben. Wat ik wel vreemd vind is dat ie als pointer moet worden doorgegeven, dat suggereert weer dat de API deze handle wil aanpassen( creeren ).
Ik ga dat eens proberen, hij verwacht een DWORD, maar daar kan dus gewoon het adres inzitten van de CreateFile toch?.
Hoop dat jullie me kunnen volgen, ik heb soms wat moeite met dingen onder woorden brengen :)

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-11 18:33
CreateFile Function

Creates or opens a file, file stream, directory, physical disk, volume, console buffer, tape drive, communications resource, mailslot, or named pipe. The function returns a handle that can be used to access the object.
Maw de return value van deze functie is de handle die de API wil hebben vermoedelijk. ( Een handle is een void*, die waarschijnlijk wel in een DWORD past :P )

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Cloud
  • Registratie: November 2001
  • Laatst online: 03-11 10:25

Cloud

FP ProMod

Ex-moderatie mobster

VO-Zephyr schreef op donderdag 07 februari 2008 @ 08:47:
Dat is een goede tip :) In principe hoef ik alleen met dat apparaatje te praten, en een app te schrijven die al die data uitleest die het apparaat binnenkrijgt. Zou dit een probleem zijn, of kan ik beter terug/naar C++ ?
Je kunt prima de applicatie in .NET 2.0 (of 3.5!) CF schrijven hoor :) In C++ ga je meer tijd kwijt zijn om hetzelfde te bouwen. Het kán natuurlijk wel.

Never attribute to malice that which can be adequately explained by stupidity. - Robert J. Hanlon
60% of the time, it works all the time. - Brian Fantana


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 05-09 14:39

_Thanatos_

Ja, en kaal

In C++ ga je meer tijd kwijt zijn om hetzelfde te bouwen. Het kán natuurlijk wel.
Ik zou het ook in.NET CF doen, maar het ligt er maar aan wat je beter ligt. Als C++ expert zul je het in C++ sneller voor mekaar hebben :)

Daarnaast moet je wel eerst nagaan of het apparaat waar het op moet komen te draaien, het framework geinstalleerd krijgt wat je denkt te gaan gebruiken.

日本!🎌


  • Invisible_man
  • Registratie: Juni 2006
  • Laatst online: 20-11 15:41
Uit ervaring kan ik je iig zeggen dat de code die je voor .net CF gebruikt voor seriele communicatie het zelfde is als voor op een pc (er zijn echter wel een aantal andere beperkingen wat het af en toe wat frustrerend maakt). De code die J_du_pee geeft is ook z'n beetje wat ik destijds gebruikt heb. Vanuit de datareceived event moet je overigens nog met invoke een andere functie aanroepen vanwege threads.

Het leuke van seriele communicatie op een pda is dat je er ook over bluetooth mee kan communiceren, in het os stel je dan de bluetooth als virtuele compoort in.

Edit:

Hier onder nog een stukje code van het invoke verhaal.

C#:
1
2
3
4
5
6
7
8
9
        void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
                this.Invoke(new EventHandler(ReadSerial));
        }
        private void ReadSerial(object s, EventArgs e)
        {
                String temp = serialPort.ReadLine();
                //Doe iets met temp
        }

[ Voor 27% gewijzigd door Invisible_man op 07-02-2008 18:42 ]


  • VO-Zephyr
  • Registratie: Mei 2001
  • Laatst online: 28-03-2024
Ben vergeten te reageren :o
De dll gaat niet samenwerken met SerialPort klasse uit C# ben ik achter gekomen. Nu moet ik dus een
Mscomm32 poort gaan aanmaken, want daar kan de dll wel mee overweg. Ik kreeg het niet voor elkaar rechtstrees de Mscomm32.ocx te includen (add referenence). Kan dat kloppen? Ik gebruik nu DesktopSerialIO die als een soort wrapper werkt, en hetzelfde biedt als Mscomm32 doet onder c++
Pagina: 1