我想在我的串行端口上發送一個特定的字符串,並將答案讀入緩衝區以供進一步分析。我已經拿出了一些代碼,但即使是屏幕上的/dev/ttyUSB0 19200在shell上工作得很好,我也無法閱讀任何答案。 Decive需要8個數據位,1個起始位,1個停止位和無奇偶校驗。在19200波特。 現在我的代碼看起來是這樣的,是它讓timning出::(在Linux上的串行編程C
/////////////////////////////////////////////////
// Serial port interface program //
/////////////////////////////////////////////////
#include <stdio.h> // standard input/output functions
#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 definitionss
#include <time.h> // time calls
int open_port(void)
{
int fd; // file description for the serial port
fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);
if(fd == -1) // if open is unsucessful
{
perror("open_port: Unable to open /dev/ttyUSB0");
}
else
{
fcntl(fd, F_SETFL, 0);
}
return(fd);
}
int configure_port(int fd) // configure the port
{
struct termios port_settings; // structure to store the port settings in
cfsetispeed(&port_settings, B19200); // set baud rates
cfsetospeed(&port_settings, B19200);
port_settings.c_cflag &= ~PARENB; // set no parity, stop bits, data bits
port_settings.c_cflag &= ~CSTOPB;
port_settings.c_cflag &= ~CSIZE;
port_settings.c_cflag |= CS8;
cfmakeraw(&port_settings);
tcsetattr(fd, TCSANOW, &port_settings); // apply the settings to the port
return(fd);
}
int query_modem(int fd) // query modem with an AT command
{
int n;
fd_set rdfs;
struct timeval timeout;
ssize_t retval;
char bufptr[100];
char chr;
int cnt = 0;
int i = 0;
// initialise the timeout structure
timeout.tv_sec = 2; // ten second timeout
timeout.tv_usec = 0;
if (FD_ISSET(fd, &rdfs)){
FD_ZERO(&rdfs);
FD_CLR(fd,&rdfs);
}
retval = write(fd, "TEST\r", 5); // send an AT command followed by a CR
/*usleep(50);
while (read(fd, &chr, 1))
{
printf("0x%x\n",chr);
usleep(10);
}*/
// do the select
n = select(fd + 1, &rdfs, NULL, NULL, &timeout);
// check if an error has occured
if(n < 0)
{
perror("select failed\n");
}
else if (n == 0)
{
printf("Timeout\n");
}
else
{
printf("\nBytes detected on the port!\n");
}
}
int main(void)
{
int fd = open_port();
configure_port(fd);
query_modem(fd);
return(0);
}
什麼我希望後面是一個字符串說 「TEST」一樣在屏幕上時,我打進入 任何幫助將是不勝感激! 非常感謝你!
羅恩
你FD_ISSSET()和FD_ZERO()和FD_CLR(的使用)是沒有意義的。您無條件地需要FD_ZERO()和FD_SET()。請參閱下面的@ ott--答案。 – wildplasser