Signale an serielle Schnittstelle versenden unter Linux
-
Hallo,
ich schreibe derzeit ein C++ Programm, welches über eine serielle Schnittstelle (eigentlich USB Bluetooth Adapter) Befehle an einen Roboter versendet. Dieser führt dann die eintreffenden Befehle aus.
Mein Programm läuft so weit, jedoch habe ich ein Problem beim senden.using namespace std; int main() { //Parameter int fd; int n; int m; char buf[16]; struct termios term_attr; // settings term_attr.c_cflag = B115200 | CS8 | CLOCAL | CREAD; term_attr.c_iflag = 0; term_attr.c_oflag = OPOST | ONLCR; term_attr.c_lflag = 0; fd = open(DEVICE, O_RDWR); if (fd == -1) { cout << "Can't open device " << endl; return(1); } else cout << "device open " << endl; // transfer rate cfsetospeed(&term_attr,B115200); // 115200 baud cfsetispeed(&term_attr,B115200); tcsetattr(fd,TCSANOW,&term_attr); char str[] = {0x77, 0x77}; // Hex m = read(fd, buf, 16); if (m == -1) { cout << " Error read " << endl; } else cout << "read: " << buf << endl; n = write(fd,str,sizeof(str)); if (n ==-1) { cout << "Error write " << endl; return (1); } else cout << "Bytes are send " << endl; close(fd); }
Ich muss sicher irgendwas bei char str[] verändern, jedoch hab ich keinen Schimmer was genau. Den ersten Befehl versendet er und wird auch korrekt ausgeführt aber der zweite leider nicht mehr.
Es wird auch nur ein Byte gesendet, ergo muss ich irgendwie was verändern damit ich mehrere Bytes hintereinander senden kann.Danke schon mal
LG
-
Ausschnitt aus der man page: (einfach man 2 write ins Terminal eingeben)
ssize_t write(int fd, const void *buf, size_t count); ... write() writes up to count bytes from the buffer pointed buf to the file referred to by the file descriptor fd. The number of bytes written may be less than count if, for example, there is insufficient space on the underlying physical medium, or the RLIMIT_FSIZE resource limit is encountered (see setrlimit(2)), or the call was interrupted by a signal handler after having written less than count bytes. (See also pipe(7).)
Du willst 2 Byte senden, es kann aber sein, dass du dafür die write Funktion 2mal aufrufen musst!
So auf die Art:(Pseudecode) toSend=Bytecount(str) while(toSend>0) { currSent=write(...) if(currSent>=0) toSend=toSend-currSent else return ERROR }
Ansonsten sei noch zu erwähnen, dass ein return Wert <0 normalerweise bedeutet, dass ein Fehler aufgetreten ist. Du hast immer nur auf -1 geprüft.