skicka seriell data med c++
skicka seriell data med c++
Hej!
Någon som har erfarenhet av att skicka data seriellt från ett console c++ program via com-porten?
har lite problem å få igång det..
/mullemeck
Någon som har erfarenhet av att skicka data seriellt från ett console c++ program via com-porten?
har lite problem å få igång det..
/mullemeck
Precis som ovanstående talare så kan man med fördel använda sig av inpb(); samt outpb();. DOCK så fungerare detta inte om man använder ett operativsystem som är av modernare slag, ex. win2k, XP eller motsv.
Detta pga av NT-kärnan.
På Win9X, WinME och de tidigare versionerna går det utmärkt. Bara att ta reda på adressen tillporten och därefter skriva direkt till den outportb(adress, tal); eller om det var tvärtom =P .
Använder du Linux, så är det ännu enklare, här är lite exempelkod.
http://www.comptechdoc.org/os/linux/pro ... erial.html
Lycka till.
Detta pga av NT-kärnan.
På Win9X, WinME och de tidigare versionerna går det utmärkt. Bara att ta reda på adressen tillporten och därefter skriva direkt till den outportb(adress, tal); eller om det var tvärtom =P .
Använder du Linux, så är det ännu enklare, här är lite exempelkod.
http://www.comptechdoc.org/os/linux/pro ... erial.html
Lycka till.
-
- Inlägg: 2360
- Blev medlem: 16 september 2003, 17:18:13
- Ort: Dubai, United Arab Emirates
- Kontakt:
mullemeck: Hur har du gjort det? Är det ett event-stryrt program som ligger och i en loop och läser av händelser med GetMessage()/PeekMessage(), eller är det kodat på "vanligt icke windows"-sätt utan events?
Hur som helst så burkar jag fylla i lämplig info i en DCB medlest BuildCommDBC(), öppna en filehandle till commporten med CreateFile() med READ+WRITE och EXISTING. Därefter kan det vara bra att sätta lite timouts och bufferstorlekar och sådant med SetCommState(), SetupComm() och SetCommTimeout(). Kanske man inte ska glömma att slå på DTR/RTS med EscapeCommFunction() heller.
Därefter är det bara att köra WriteFile() och ReadFile() på den handle som man fick av CreateFile().
Hur långt har du kommit med det hela? Och vart skiter det sig nånstans?
Hur som helst så burkar jag fylla i lämplig info i en DCB medlest BuildCommDBC(), öppna en filehandle till commporten med CreateFile() med READ+WRITE och EXISTING. Därefter kan det vara bra att sätta lite timouts och bufferstorlekar och sådant med SetCommState(), SetupComm() och SetCommTimeout(). Kanske man inte ska glömma att slå på DTR/RTS med EscapeCommFunction() heller.
Därefter är det bara att köra WriteFile() och ReadFile() på den handle som man fick av CreateFile().
Hur långt har du kommit med det hela? Och vart skiter det sig nånstans?
Grejen är väl den att dessa funktioner inp() och outp() använder sig av instruktionerna in och out. Dessa instruktioner är tydligen inte tillåtna att köra om man inte är i supervisor mode. Därav får man man nåt fel i stil med "priviliged instruction bla bla bla" då man kör programmet.
Tror att den här ioport.dll fixar så att man får använda dessa.
Jag har själv aldrig testat ioport.dll. Har bara läst nåt sånt.
XP, NT och 2000 ska ju ha sån kontroll på all hårdvara så man blir snart lite elak!
Tror att den här ioport.dll fixar så att man får använda dessa.
Jag har själv aldrig testat ioport.dll. Har bara läst nåt sånt.
XP, NT och 2000 ska ju ha sån kontroll på all hårdvara så man blir snart lite elak!
-
- Inlägg: 2360
- Blev medlem: 16 september 2003, 17:18:13
- Ort: Dubai, United Arab Emirates
- Kontakt:
Ok, då förstår jag. "dessa funktioner" åsfyftade inp/outp och intte kernel32-rutinerna.
Fast jag misstänker att inp/outp är mera praktiska för LPT än COM. Detta med tanke på att man bör sätta upp en interrupthanterad mottagning med en cirkulär buffer för mottagning på kommporten, annars riskerar man att tappa tecken om det kommer in en burst med tecken i hög hastighet. På printerporten har man oftast inte sådana problem eftersom det är mestadels ett ut-device.
Man skulle förvisso kunna sätta upp en cirkulär interruptstyrd rx-buffer manuellt med hjällp av ioport.dll (eller det kanske till och med finns färdigimplementerat i den?), men då tror jag nästan att det blir enklare, stabilare och mer portabelt med OpenFile-metoden.
Fast jag misstänker att inp/outp är mera praktiska för LPT än COM. Detta med tanke på att man bör sätta upp en interrupthanterad mottagning med en cirkulär buffer för mottagning på kommporten, annars riskerar man att tappa tecken om det kommer in en burst med tecken i hög hastighet. På printerporten har man oftast inte sådana problem eftersom det är mestadels ett ut-device.
Man skulle förvisso kunna sätta upp en cirkulär interruptstyrd rx-buffer manuellt med hjällp av ioport.dll (eller det kanske till och med finns färdigimplementerat i den?), men då tror jag nästan att det blir enklare, stabilare och mer portabelt med OpenFile-metoden.
Förlåt, jag uttryckte mig nog lite knapphänt i första inlägget..
det jag vill göra är att skicka ut 150 byte, ett byte i taget till com-porten i 2400 baud.
de värden jag vill skicka ut ligger i en array..
jag kör med bloodshead devc++ under window xp.
jag är ganska newbie på c++ så jag skulle uppskatta lite exempelkod.
det jag vill göra är att skicka ut 150 byte, ett byte i taget till com-porten i 2400 baud.
de värden jag vill skicka ut ligger i en array..
jag kör med bloodshead devc++ under window xp.
jag är ganska newbie på c++ så jag skulle uppskatta lite exempelkod.
-
- Inlägg: 2360
- Blev medlem: 16 september 2003, 17:18:13
- Ort: Dubai, United Arab Emirates
- Kontakt:
Ett snabbt hophackat exempel på att skicka en sträng till serieporten, det borde räcka för att få igång dig.
Jag kan förressten rekommendera PORTMON från SysInternals http://www.sysinternals.com/ntw2k/utilities.shtml , med det kan man spionera på allt dom har med porten att göra. Alla inställningar som görs, data, events osv. Mycket praktiskt.
Nåväl, här är mitt 5-minuters exempel-hack:
Jag kan förressten rekommendera PORTMON från SysInternals http://www.sysinternals.com/ntw2k/utilities.shtml , med det kan man spionera på allt dom har med porten att göra. Alla inställningar som görs, data, events osv. Mycket praktiskt.
Nåväl, här är mitt 5-minuters exempel-hack:
Kod: Markera allt
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
int main(int argc, char* argv[]) {
char sTmp[100];
HANDLE hPort;
DCB dcb;
BOOL bResult;
char data[250];
unsigned long datalen;
unsigned long byteswritten;
// Öppna porten
hPort=CreateFile("COM3:",
GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
if (hPort==INVALID_HANDLE_VALUE) {
perror("CreateFile");
return 1;
}
// Bygg upp en inställningstruktur
ZeroMemory(&dcb,sizeof(DCB));
strcpy(sTmp,"baud=2400 parity=N data=8 stop=1");
if (!BuildCommDCB((char*)&sTmp,&dcb)) {
perror("BuildcommDCB");
return 1;
}
// Peta in inställningarna på porten
bResult=SetCommState(hPort,&dcb);
if (!bResult) {
perror("SetCommState");
return 3;
}
// Slå på DTR/RTS
EscapeCommFunction(hPort, SETDTR);
EscapeCommFunction(hPort, SETRTS);
// Skicka lite data till porten
strcpy(data,"ALLAN TAR KAKAN I 2400 BAUD\n");
datalen=strlen(data);
bResult=WriteFile(hPort,data,datalen,&byteswritten,NULL);
if (!bResult) {
perror("WriteFile");
return 5;
}
printf("Skrev %ld av %ld bytes\n",byteswritten,datalen);
// Stäng porten
CloseHandle(hPort);
printf("done\n");
return 0;
}
Kan ge ett litet tips om ett färdigt klasspaket för dem som använder C++.
http://www.bbdsoft.com/downloads/win32/comport.zip
Fantastiskt smidigt och enkelt!!
http://www.bbdsoft.com/downloads/win32/comport.zip
Fantastiskt smidigt och enkelt!!