bool serial_port::serial_port_write_read_at(const std::string &at_command, const std::string &resp_prefix, AT_RESPONSE *at_response) { char *read_line; bool ret_value = false; pthread_mutex_lock(&read_write_mutex); if (!serial_port_write_at_cmd(at_command.c_str())) { goto END; } do { read_line = serial_port_read_one_line(); if (read_line) { //LOG_F(INFO, "read one line from serial: %s", read_line); if (!strncmp(read_line, "AT", strlen("AT")) || !strncmp(read_line, "at", strlen("at"))) { //Do nothing } else if (!strncmp(read_line, "OK", strlen("OK"))) { //LOG_F(INFO, "find final response OK"); ret_value = true; if (at_response != nullptr) { at_response->state = RESP_OK; } break; } else if (!strncmp(read_line, "ERROR", strlen("ERROR")) || !strncmp(read_line, "+CME ERROR", strlen("+CME ERROR"))) { //LOG_F(INFO, "find final response ERROR"); ret_value = false; if (at_response != nullptr) { at_response->state = RESP_ERROR; } break; } else { if (at_response != nullptr) { //LOG_F(INFO, "put response string to AT_RESPONSE"); at_response->response_data[at_response->response_lines] = strdup(read_line); at_response->response_lines += 1; if (at_response->response_lines >= MAX_RESPONSE_LENGTH) at_response->response_lines = 0; } } } } while (true); END: pthread_mutex_unlock(&read_write_mutex); return ret_value; } 没有break反复循环的情况下,开头都是从serial_port_read_one_line这里开始吗?也就是do后面开始执行
时间: 2024-04-18 20:30:47 浏览: 25
是的,如果没有`break`语句来跳出循环,那么每次循环开始时都会执行`serial_port_read_one_line`函数来读取一行数据,并根据读取的内容进行相应的处理。所以,在没有`break`的情况下,循环会一直执行,并且每次循环开始都会重新调用`serial_port_read_one_line`函数。在这段代码中,循环体的开头就是从`serial_port_read_one_line`这里开始执行。
相关问题
fortran怎么调用c++bool my_cpp_read(const std::string &fullName)
在Fortran中调用C++函数需要使用Fortran/C混合编程的方式。具体步骤如下:
1. 在C++中定义函数bool my_cpp_read(const std::string &fullName),并使用extern "C"修饰符将其声明为C函数。例如:
```
extern "C" bool my_cpp_read(const std::string &fullName) {
// C++函数的实现
// ...
}
```
2. 在Fortran程序中使用bind(C)修饰符声明Fortran接口函数,并使用ISO_C_BINDING模块中的C_CHAR类型表示C++中的const char*类型。同时,使用LOGICAL(KIND=C_BOOL)类型表示C++中的bool类型。例如:
```
USE ISO_C_BINDING
INTERFACE
FUNCTION my_cpp_read(fullName) BIND(C, NAME='my_cpp_read')
USE, INTRINSIC :: ISO_C_BINDING
IMPLICIT NONE
CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: fullName
LOGICAL(KIND=C_BOOL) :: my_cpp_read
END FUNCTION my_cpp_read
END INTERFACE
```
3. 在Fortran程序中调用C++函数my_cpp_read。在调用时,需要将Fortran中的字符串转换为C++中的std::string类型,并将C++中的bool类型转换为Fortran中的LOGICAL(KIND=C_BOOL)类型。例如:
```
PROGRAM main
USE ISO_C_BINDING
IMPLICIT NONE
CHARACTER(KIND=C_CHAR), PARAMETER :: file_name_c = "test.txt"
CHARACTER(LEN=LEN(file_name_c)) :: file_name
LOGICAL(KIND=C_BOOL) :: read_success
file_name = TRANSFER(file_name_c, file_name)
read_success = my_cpp_read(file_name)
IF (read_success) THEN
PRINT *, "Read file successfully"
ELSE
PRINT *, "Failed to read file"
END IF
END PROGRAM main
```
以上是Fortran调用C++函数的一般步骤,具体实现可能需要根据实际情况进行修改和调整。
bool my_cpp_read(const std::string &fullName); fortran90调用c++函数
在 Fortran90 中调用 C++ 函数需要使用 C++ 的名称修饰规则。你需要在 C++ 函数前面添加 extern "C" 关键字,以告诉编译器使用 C 语言的名称修饰规则。例如,你可以将以下代码添加到 C++ 函数声明的前面:
```
#ifdef __cplusplus
extern "C" {
#endif
bool my_cpp_read(const char* fullName);
#ifdef __cplusplus
}
#endif
```
然后,在 Fortran90 代码中,你可以使用 ISO_C_BINDING 模块定义一个 C 函数指针类型,并使用 BIND(C) 属性将其绑定到 C++ 函数。代码如下:
```
use iso_c_binding
interface
function my_cpp_read(fullName) bind(C, name="my_cpp_read")
import :: C_CHAR
type(c_ptr), value :: fullName
logical :: my_cpp_read
end function
end interface
character(len=*), dimension(:), allocatable :: fullName
logical :: result
! 调用 C++ 函数
fullName = "file_name.txt"
result = my_cpp_read(c_loc(fullName))
```
注意,你需要将 Fortran90 字符串转换为 C 字符串,这里使用了 c_loc() 函数获取字符数组的地址。