gpt4 book ai didi

c - C语言在linux上的串行编程

转载 作者:太空宇宙 更新时间:2023-11-04 11:32:00 25 4
gpt4 key购买 nike

我想在我的串行端口上发送某个字符串并将答案读入缓冲区以供进一步分析。我想出了一些代码,但我无法阅读任何答案,即使外壳上的屏幕 /dev/ttyUSB0 19200 对我来说工作得很好。该设备需要 8 个数据位、1 个起始位、1 个停止位且无奇偶校验。在 19200 波特。现在我的代码看起来像这样并且它一直在超时::(

/////////////////////////////////////////////////
// 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);
}

我期望返回的是一个字符串“测试”与我按回车键时屏幕中的相同。任何帮助,将不胜感激!非常感谢!

罗恩

最佳答案

我的建议是您还没有将 fd 添加到 rfds。检查FD_*宏清除一个集合,添加一个fd并检查一个fd是否有输入。

更新

您真的需要将 fd 添加到 fdset 中:

write(...
FD_ZERO(&rdfs);
FD_SET(fd, &rfds);
n = select(...
if (n > 0) {
if (FD_ISSET(fd, &rfds)) {
// this fd has input waiting to be read

当您选择多个 fd 时,n 可以变为 > 1。

关于c - C语言在linux上的串行编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10710083/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com