Serieportsprogrammering

Hej

Jag sitter och försöker bygga en serieport-till-I2C-omvandlare, använder kretsen max232 och ett par transistorer mellan. När jag ska sända data och clock så använder jag RTS och DTR på serieporten, när jag sen vill läsa så använder jag DSR och CTS.

Problemet är nu att "inget händer". Jag kan skriva till porten com2 (2FBhex) och läsa det jag skrivit, men inget händer elektriskt på porten. Jag har testat porten genom att köra IC-prog och då har signaler kommit fram så det är inget kabelbrott. (Jag har kopplat ett par lysdioder via transistorer till ttl-utgångarna på max232:an för att kunna se när dessa är ettor eller nollor. )

Jag använder ett litet enkelt c-program som skriver direkt till porten. Det är kompilerat med djgpp. Jag kör i Windows98. Är det någon drivrutin som hindrar eller går det inte att köra direkt I/O i Win98?

Här är testprogrammet (ska sätta på och stänga av RTS och DTR ett par gånger):

#include #include

int main(void) { unsigned char a; outportb(0x2FB,0); delay(250); outportb(0x2FB,0x0b); delay(250); outportb(0x2FB,0); delay(250); outportb(0x2FB,0x0b); delay(250); outportb(0x2FB,0); delay(250); a=inportb(0x2FB); printf("Laser byte pa MCR: %xh\n",a); delay(100); printf("Satter byte pa MCR till 0x0b...\n"); outportb(0x2FB,0x0b); delay(250); a=inportb(0x2FB); delay(100); printf("Laser byte pa MCR: %xh\n",a); delay(100); return 0; }

Har någon tips om vad jag kan göra för att få det hela att funka?

mvh Oscar Johansson

Reply to
Oscar Johansson
Loading thread data ...

Bara några saker som du kan kolla...

Fungerar det om du inte startar Windows 98 utan startar med bara en ren DOS-prompt och kör ditt program?

Har du kollat så att adressen för I/O-registren för COM-porten verkligen är 0x02FB? I DOS kollar man detta på minnesadress 0040h:0000h för COM1, alltså i C-kod:

short com_io_address = *(short far *)0x00400000; För COM2 blir det 0x00400002 osv.

Men eftersom du ändå kör programmet under Windows 98 så är det i allmänhet bättre att göra ett Windows-program istället och använda Win32-funktioner, du behöver då inte bry dig om I/O-adresser eller liknande utan serieportsdrivrutinen i Windows fixar detta. En annan fördel med att göra det som ett Windows-program är också att sådana kan hänga med in i Windows NT/2000/XP osv också utan att Windows protesterar mot att du försöker komma åt portarna direkt. Det är inte särskilt mycket mer avancerat att göra det som ett Windows-program, du kan göra enkla konsolbaserade program med en main()-funktion som start precis som man gör i DOS-program.

Som kompilator rekommenderar jag mingw32, det är en Win32-port av gcc-kompilatorn. Har du skrivit djgpp-program tidigare så bär det inte vara särskilt svårt att få dom att kompilera för Win32 med mingw32.

Alternativt är det inte dumt att ha gratisversionen av Microsoft Visual C-kompilatorn:

formatting link
Det finns ganska mycket exempelkod på olika håll som är lättare att få att fungera under Windows med den kompilatorn. Man måste dock komplettera den med paketet Core SDK för att få tillgång till headerfilerna för Win32-API:
formatting link

Lite exempelkod för Win32 (konsolprogram, inget grafiskt): (Du kan eventuellt behöva komplettera med att anropa SetCommState() för att ställa in COM-porten först så att den inte försöker sköta handskakningspinnarna själv.)

#include

int main(int argc, char **argv) { DWORD a; HANDLE hComm = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if (hComm == INVALID_HANDLE_VALUE) { fprintf(stderr, "Fel %u, kan inte öppna porten.\n", GetLastError()); return 1; }

EscapeCommFunction(hComm, CLRRTS); EscapeCommFunction(hComm, CLRDTR); Sleep(250); EscapeCommFunction(hComm, SETRTS); EscapeCommFunction(hComm, SETDTR); Sleep(250); EscapeCommFunction(hComm, CLRRTS); EscapeCommFunction(hComm, CLRDTR); Sleep(250); EscapeCommFunction(hComm, SETRTS); EscapeCommFunction(hComm, SETDTR); Sleep(250); EscapeCommFunction(hComm, CLRRTS); EscapeCommFunction(hComm, CLRDTR); Sleep(250); GetCommModemStatus(hComm, &a); printf("Laser byte pa MCR: %xh\n",a); Sleep(100); printf("Satter byte pa MCR till 0x0b...\n"); EscapeCommFunction(hComm, SETRTS); EscapeCommFunction(hComm, SETDTR); Sleep(250); GetCommModemStatus(hComm, &a); Sleep(100); printf("Laser byte pa MCR: %xh\n",a); Sleep(100); return 0; }

--
Olof Lagerkvist           sm6xmk
ICQ: 724451                     @ssa.se
Web: http://here.is/olof
Reply to
Olof Lagerkvist

Olof Lagerkvist wrote in news:0B4Wd.18889$d5.145215 @newsb.telia.net:

ren

verkligen

COM1,

kan

protesterar

som

Visual

för

KUL med lite "gammeldags" programmering... man blir rent nostalgisk..

Men inget är som Assembler för 68000... *sucka*

//Beng

Reply to
Beng

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.