Hallo Leute,
ich versuche gerade mit einer BHKW-Steuerung über RS232 eine Verbindung aufzubauen.
Man soll beim senden von 0x0c eine 48Byte lange Antwort erhalten. Eine Antwort erhalte ich ja schon, aber die ist nicht so wie erwartet. (meistens kürzer)
Meine Frage ist zu nächst, was die RS232 wirklich sendet bei einem 32Bit Betrienssystem. Ich verwende Suse 8.2 mit Kernel 2.6. Da ist ein int 32Bit lang und ein Char natürlich auch. Also ist das kleinste was ich senden kann ein Zeich. (0x0000000c) z.B
In meiner antwort befinden sich aber Zeichen wie 0xfffffffe(oder dezimal -32) das ist mit 8 bit nicht zu machen.
Mache ich einen Gedanken fehler?
oder werden immer 4x 8bit gesendet?
oder werden Pro Zeichen nur 8Bit gesendet.
Nun noch zu meiner Umgebung:
ich soll die Schnittstelle auf "9600,8,1 kein Parity und kein Flow Control" einstellen.
und ich habe folgendes Programm geschrieben (bzw. zusammen copiert)
Code:
#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 */
int fd; /* File descriptor for the port */
struct termios term_attr;
int open_port(void) {
// * 'open_port()' - Open serial port 1.
// * Returns the file descriptor on success or -1 on error.
fd = open("/dev/ttyS1", O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1) {
printf("\nopen_port: Unable to open /dev/ttyS1 - \n\n");
}
else {
// Konfig lesen
if (tcgetattr(fd, &term_attr) != 0)
{
printf("terminal: tcgetattr() failed");
return(-1);
}
// Konfig setzen
cfsetispeed(&term_attr, B9600);
cfsetospeed(&term_attr, B9600);
term_attr.c_cflag &= ~PARENB;
term_attr.c_cflag &= ~CSTOPB;
term_attr.c_cflag &= ~CSIZE;
term_attr.c_cflag |= CS8;
term_attr.c_cflag &= ~CRTSCTS;
term_attr.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
term_attr.c_oflag &= ~OPOST;
term_attr.c_lflag = 0;
// Konfig Schreiben
if (tcsetattr(fd, TCSAFLUSH, &term_attr) != 0)
{
printf("terminal: tcsetattr() failed");
}
fcntl(fd, F_SETFL, 0);
}
return (fd);
}
void close_port() {
close(fd);
}
int main(void) {
int iOut;
int iIn;
char buffer[100];
char put=0xC0;
if (open_port() != -1) {
printf("\nVerbindung zum Dachs wurde hergestellt Port = %d\n", fd);
iOut = write(fd, &put, 1);
printf("Daten gesendet: %d \n",iOut);
if (iOut == -1) return (-1);
iIn = read(fd, buffer, 100);
printf("Empfange %d Zeichen: #%d#%d#%d#%d#%d#%d#%d#%d#\n",iIn, buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5], buffer[6], buffer[7], buffer[8]);
close_port();
printf("Verbindung wurde getrennt\n");
}
else {
printf("\n\nFehler... Verbindung konnte nicht hergestellt werden\n");
}
}
Lesezeichen