lørdag den 11. december 2010

Øvelse 12

UART, RS232 og en rigtig god guide her: http://www.easysw.com/~mike/serial/serial.html

Koden indsættes, kig godt på den, der er nemlig //kommentarer i den :)

read.cpp, koden der læser fra en port, og dermed modtager det:


#include <stdio.h> /* Standard input/output definitions */
#include <string.h> /* String function definitions */
#include <unistd.h> /* UNIX standard function definitions */
#include <fcntl.h> /* File control definitions */
#include <errno.h> /* Error number definitions */
#include <termios.h> /* POSIX terminal control definitions */

//opretter POSIX terminal struct, hvor vi kan indsætte muligheder
struct termios options;

void main()
{
//åbner porten, /dev/ttyS0 angiver at der arbejdes med seriel kabler. (J1)
int fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);

/*fcntl () angiver om den skal være blocking*/
fcntl(fd, F_SETFL, 0);

//IOCTL kald der ligger i .
tcgetattr(fd, &options);

//Her opsættes BAUD til 115200
cfsetispeed(&options, B115200);
cfsetospeed(&options, B115200);

//Aktiver modtageren og fastsætte lokale mode ...
options.c_cflag | = (clocal | CREAD);

//Sæt de nye muligheder for porten ...
tcsetattr(fd, TCSANOW, &options);

//opsætter til ingen paritet 8-bit (8N1):
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;


//laver en modtage buffer
char buf [21];
read(fd,buf, 20);

//udskriver det til skærmen:
printf("Der modtages: %s",buf);
}


For write.cpp, skrives der til porten, dermed betyder det at vi sender:

#include <stdio.h> /* Standard input/output definitions */
#include <string.h> /* String function definitions */
#include <unistd.h> /* UNIX standard function definitions */
#include <fcntl.h> /* File control definitions */
#include <errno.h> /* Error number definitions */
#include <termios.h> /* POSIX terminal control definitions */

struct termios options;
void main()
{
int fd = open("/dev/ttyS1", O_RDWR | O_NOCTTY | O_NDELAY);
fcntl(fd, F_SETFL, 0);
tcgetattr(fd, &options);

//Sætter Baud til 115200
cfsetispeed(&options, B115200);
cfsetospeed(&options, B115200);

//Aktiver modtageren og fastsætte lokale mode ...
options.c_cflag |= (CLOCAL | CREAD);

//Sæt de nye muligheder for porten ...
tcsetattr(fd, TCSANOW, &options);

//opsætter til ingen paritet 8-bit (8N1):
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;

//opretter skrive buffer:
char buf [21];

//Udskrver at brugeren gerne må skrive noget:
printf("Indskriv tekst (max 20 char.)\n\r");

//low-tec CIN:
gets(buf);

//skriver til filen, og dermed sender den noget:
write(fd,buf, sizeof(buf));
}

Vi sluttede de to porte sammen, med et null modem, startede to terminaler op, kørte read i den ene, og write i den anden, og minsandten om den ikke sendte:


og modtog:


1 kommentar: