串行Comm共享库与ctypes一起使用时发送错误的数据

时间:2018-06-25 09:14:46

标签: python-3.x ctypes

我建立了一个简单的串行通信共享库,我正在尝试使用ctypes库在python中使用它。我要执行的步骤是:

  1. 通过调用ctypes.cdll.loadlibrary()来加载.so文件。
  2. 初始化串行通信模块。
  3. 发送0xFF作为同步字节。

当我执行上述步骤时,我并不仅在另一端获取垃圾数据。有趣的是,当我在C中使用.so文件并执行相同的操作时,它绝对可以正常工作。所以我的问题是ctypes模块是否以任何方式操纵加载的库?我是在Python中使用C的新手,在这里空白。任何建议都将非常有帮助。

#!/usr/bin/env python3
import ctypes
test_lib = ctypes.cdll.LoadLibrary("./demo_static.so")
string2 = "/dev/ttyS2"
# create byte objects from the strings
UART_RIGHT = string2.encode('utf-8')
baud = 500000
test_lib.serial_com_init(0, UART_RIGHT, baud)

(相关的)C代码:

int serial_com_init(char *left, char *right, int baudrate) {
    int fd_l, fd_r;
    uart_t uart_left, uart_right;
    uint8_t flags_l, flags_r;
    if (left) {
        fd_l = uart_init_linux(left, baudrate);
        uart_left->fd = fd_l;
    }
    if (right) {
        fd_r = uart_init_linux(right, baudrate);
        uart_right->fd = fd_r;
    }
    serial_com_init_cr(uart_left, uart_right, flags_l, flags_r); 
    serial_com_hello_init();
    return 0;
}

1 个答案:

答案 0 :(得分:0)

根据[Python]: ctypes: Specifying the required argument types (function prototypes)的功能,例如:

int serial_com_init(char *left, char *right, int baudrate);

您需要指定参数类型(在函数调用前之前)。这对64位 Python 至关重要:

test_lib.serial_com_init.argtypes = [ctypes.c_char_p, ctypes.c_char_p, ctypes.c_int]
init_result = test_lib.serial_com_init(None, UART_RIGHT, baud)

注释

  • 这是可能的原因之一
  • 总是检查函数返回代码(好吧,这里总是 0 ,这可能会在 C中隐藏错误代码)
  • 您可以直接使用 bytes 文字:UART_RIGHT = b"/dev/ttyS2"