Bertel Brander wrote:
> jokaas wrote:
>
>> Hi folks!
>>
>> Har søgt, men ej fundet skelet filer til serial og parallel kommunikation
>> fra kode afviklet på Cygwin/windows..
>> Skal der nogle .dll'er eller andet til eller ???
>>
>> Er der nogle her der kan lede mig i rette retning ?
>>
>
> Du kan gøre det på to måder: "The Unix/Linux way" eller "The Windows
> way".
>
> Den første har den fordel at den også virker på Unix/Linux.
>
> Den anden har (efter min mening) den fordel at det er lidt lettere.
>
> Hvis du bruger den første metode skal du bruge open(...) til at
> åbne en "fil" der er en port og ioctl(...) til at sætte porten op.
> Du læser og skriver vha. read(...) og write(...).
>
> Hvis du bruder den anden metode skal du bruge CreateFile(...) til at
> åben filen/porten, SetCommTimeouts(...) og SetCommState(...) til at
> sætte porten op, samt WriteFile(...) og ReadFile(...) til at
> skrive/læse.
>
> /b
>
Jeg fandt lige et lille program jeg en gang lavede, det åbner com-porten
og sender nogle AT-kommandoer. Hvis der sidder en mobil i den anden ende
burde denne svare, svaret vil blive læst og udskrevet. Koden kompilerer
og kører med cygwin. Som du kan se bruger det windows måden.
#include <stdio.h>
#include <windows.h>
void SetTimeOut(HANDLE Port, int sec)
{
COMMTIMEOUTS commtimeouts;
GetCommTimeouts(Port, &commtimeouts);
commtimeouts.ReadIntervalTimeout = 1000*sec;
commtimeouts.ReadTotalTimeoutMultiplier = 10;
commtimeouts.ReadTotalTimeoutConstant = 1000*sec;
SetCommTimeouts(Port, &commtimeouts);
}
void Tx(HANDLE Port, const char *data)
{
DWORD Dummy;
WriteFile(Port, data, strlen(data), &Dummy, 0);
WriteFile(Port, "\r\n", 2, &Dummy, 0);
}
void Rx(HANDLE Port)
{
char Buffer[128];
DWORD Length, i;
ReadFile(Port, Buffer, 128, &Length, 0);
for(i = 0; i < Length; i++)
if(Buffer[i] != '\r')
printf("%c", Buffer[i]);
}
int main(void)
{
DCB dcb;
HANDLE ComPort = CreateFile("COM2", GENERIC_READ | GENERIC_WRITE, 0,
0, OPEN_EXISTING, 0, 0);
GetCommState(ComPort, &dcb);
dcb.BaudRate = 9600;
dcb.ByteSize = 8;
dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
dcb.fOutxCtsFlow = 1;
SetCommState(ComPort, &dcb);
SetTimeOut(ComPort, 1);
Tx(ComPort, "AT");
Rx(ComPort);
Tx(ComPort, "ATZ");
Rx(ComPort);
CloseHandle(ComPort);
return 0;
}
|