上位机图像处理和嵌入式模块部署(利用python开发软件)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
开发windows和linux软件的时候,大家一般都是习惯于用c/c++语言进行开发,但是目前来说很多的开发板都是支持python语言开发的。这个时候,如果不是特别复杂的功能,或者说我们已经具备了对应的linux c语言开发库,这个时候就完全可以用python来完成windows和linux的通信、以及linux软件的开发。
1、windows和linux的通信
如果是用python开发windows和linux的网络通信,这并不是一件很复杂的事情。首先我们需要确定下开发板的python版本;接着继续在windows上面安装相同版本的python版本即可,比如python3版本;这些都做好之后,就可以开始脚本的编写了。一般来说,windows作为客户端,linux作为服务器端。windows的python脚本通常是这样的,
# -*- coding:utf8 -*-
import socket
def main():
host = '192.168.0.97'
port = 12345
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
client_socket.connect((host, port))
print("成功连接到服务器")
message = "Hello, Server!"
client_socket.sendall(message.encode())
data = client_socket.recv(1024)
print(data)
except Exception as e:
print("连接或通信出现错误")
finally:
client_socket.close()
if __name__ == "__main__":
main()
而linux的python版本是这样的,
# -*- coding:utf8 -*-
import socket
def main():
host = '0.0.0.0' # 监听所有可用的网络接口
port = 12345 # 选择一个未被占用的端口
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((host, port))
server_socket.listen(1) # 同时监听一个连接
print(f"等待客户端连接在 {host}:{port} ...")
while True:
client_socket, client_address = server_socket.accept()
print(f"成功接收来自 {client_address} 的连接")
data = client_socket.recv(1024)
print(f"从客户端接收到的数据: {data.decode()}")
message = "Hello, Client!"
client_socket.sendall(message.encode())
client_socket.close()
end
server_socket.close()
if __name__ == "__main__":
main()
这样有了tcp client端和tcp server端,两者就可以进行通信处理了。
2、扩展linux端python的功能
前面我们谈到过,python自身提供的功能不一定符合我们自己的要求。所以,这个时候我们一般还需要开发一个算法库。但是算法库本身是没有办法被python直接访问的,所以通常还需要按照python的格式重新对一下接口,才能被python语言使用。假设有一个example_module.c文件,它的代码是这样的,
#include <Python.h>
static PyObject *example_function(PyObject *self, PyObject *args) {
// C 函数的实现
return Py_BuildValue("s", "Hello from C!");
}
static PyMethodDef methods[] = {
{"example_function", example_function, METH_NOARGS, "Example function"},
{NULL, NULL, 0, NULL} // 结尾标志
};
static struct PyModuleDef module = {
PyModuleDef_HEAD_INIT,
"example_module",
NULL,
-1,
methods
};
PyMODINIT_FUNC PyInit_example_module(void) {
return PyModule_Create(&module);
}
接着把这段代码进行编译,可以直接用树莓派4b自带的编译器进行编译,
gcc -o example_module.so -shared -fPIC $(python3-config --cflags) example_module.c
最后尝试一下,直接在python脚本里面调用这个动态库文件,
import example_module
result = example_module.example_function()
print(result)
如果能够看到这样的打印,那么代表整个处理的流程是没有问题的,