gpt4 book ai didi

c++ - 如何在程序中间等待来自串口的输入

转载 作者:IT王子 更新时间:2023-10-29 01:06:24 28 4
gpt4 key购买 nike

我正在编写一个程序来控制与卫星通信的铱星调制解调器。每次发送 AT 命令后,调制解调器都会发回一个回复(取决于命令)以指示命令成功。

现在我已经实现了它,以便程序在将每个命令传输到调制解调器之间只等待 10 秒,但这有点冒险,因为它不允许在命令未成功解释的情况下进行错误处理。我知道如何读取串行输入的唯一方法是使用 while(fgets( , ,)),所以我想知道如何让程序等待调制解调器通过串行端口并在发送下一个命令之前检查它是什么,而不是有一个统一的延迟。

我使用的是 linux 操作系统。

FILE *out = fopen(portName.c_str(), "w");//sets the serial port

for(int i =0; i<(sizeof(messageArray)/sizeof(messageArray[0])); i++)
{
//creates a string with the AT command that writes to the module
std::string line1("AT+SBDWT=");
line1+=convertInt( messageArray[i].numChar);
line1+=" ";
line1+=convertInt(messageArray[i].packetNumber);
line1+=" ";
line1+=messageArray[i].data;
line1+=std::string("\r\n");

//creates a string with the AT command that initiates the SBD session
std::string line2("AT+SBDI");
line2+=std::string("\r\n");

fputs(line1.c_str(), out); //sends to serial port
usleep(10000000); //Pauses between the addition of each packet.

fputs(line2.c_str(), out); //sends to serial port

usleep(10000000);
}

最佳答案

使用selectpoll在串口对应的文件描述符上,当描述符准备好读取时返回。

像这样:

int fd = fileno(stdin);  /* If the serial port is on stdin */
fd_set fds;
FD_ZERO(&fds);
FD_SET(fd, &fds);
struct timeval timeout = { 10, 0 }; /* 10 seconds */
int ret = select(fd+1, &fds, NULL, NULL, &timeout);
/* ret == 0 means timeout, ret == 1 means descriptor is ready for reading,
ret == -1 means error (check errno) */

关于c++ - 如何在程序中间等待来自串口的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6656579/

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