python 串行通信共享库在与ctype一起使用时发送错误数据

z5btuh9x  于 2023-01-08  发布在  Python
关注(0)|答案(1)|浏览(94)

我已经建立了一个简单的串行通信共享库,我尝试在python中使用ctypes库,我遵循的步骤是:
1.通过调用ctypes.cdll.loadlibrary()加载.so文件。
1.初始化串行通信模块。
1.发送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;
}
nimxete2

nimxete21#

根据[Python. Docs]:ctypes-指定所需的参数类型(函数原型),例如:

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

你需要指定参数类型(在函数调用之前)。这在 * 064bit**Python * 上有着至关重要的区别。查看[SO]: C function called from Python via ctypes returns incorrect value (@CristiFati's answer)了解更多细节:

test_lib.serial_com_init.argtypes = (ctypes.c_char_p, ctypes.c_char_p, ctypes.c_int)
test_lib.serial_com_init.restype = ctypes.c_int
init_result = test_lib.serial_com_init(None, UART_RIGHT, baud)
    • 备注**:
  • 这是可能的原因之一
      • 总是检查函数返回代码(这里它总是0**,这可能会隐藏 * C * 代码中的错误)
  • 您可以直接使用 * bytes * 字面值:第一个月

相关问题