2009-10-22 72 views
1

下面的所有代碼均可用。我的設備響應,C,7是重置。當我第二次運行它時,它不響應。如果我手動關閉設備,然後再次運行該腳本,它將起作用。但是,如果我按下按鈕第二次運行腳本,則不會。C++串行端口僅在使用寫入時才響應

RS232:57600,8,N,1

任何想法?有沒有更多的信息需要解決這個問題?

*另外,當我得到這個工作,我將不得不使用read()函數來獲取設備響應。有誰知道我需要使用正確的格式,基於下面的代碼?對不起,我是C++的新手......我更像一個PHP傢伙。

*我也不知道,如果1024是對的,但它似乎使工作呃...

#include <termios.h> 

int fd; 
struct termios options; 
fd=open("/dev/tty.KeySerial1", O_RDWR | O_NOCTTY | O_NDELAY); 
fcntl(fd, F_SETFL, 0); 
tcgetattr(fd,&options); 
options.c_ispeed=57600; 
options.c_ospeed=57600; 
options.c_cflag |= (CLOCAL | CREAD); 
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); 
options.c_cflag &= ~CSTOPB; 
options.c_lflag &= ~ECHO; 
options.c_oflag &= ~ECHO; 
options.c_oflag &= ~OPOST; 
options.c_cflag |= CS8; 
options.c_cflag |= CRTSCTS; 
options.c_cc[VMIN] = 0; 
options.c_cc[VTIME] =10; 
tcflush(fd, TCIFLUSH); 
tcsetattr(fd,TCSANOW,&options); 

write(fd, "C,7\r\n", 1024); 

close(fd); 

回答

3

1024實際上可能是你的問題。第三個參數設置爲write()功能指示要寫入的字節數:

ssize_t write(int fildes, const void *buf, size_t nbyte); 

有關詳細信息,請參閱man page for write()

在你的情況下,因爲你發送了5個字符('C'',''''''''''''''''''),所以這個數字應該是5。

通過提供1024的值,您實際上是通過串行通道發送了另外1019個垃圾字符。

更新:

read()功能幾乎相同的參數:

ssize_t read(int fildes, void *buf, size_t nbyte); 

注意,你必須提供一個讀寫緩存作爲第二個參數。例如,要讀12個字節你可以使用:

char someData[12]; 
read(fd, someData, 12); 

我不太清楚如何確定你需要閱讀的字符數,而是由函數返回的ssize_t數字會告訴你有多少人實際閱讀。

+0

輝煌!這工作!這一小小的改變會讓我整天(或更多)弄清楚。 非常感謝您! 有關我的read()函數格式的任何想法? :) – Pfeffer 2009-10-22 18:56:07