一、前言
我没有选择使用wiringpi库进行串口通信
用的是serial库,但是一样可以通信的,没啥大问题
二、实现方法
(一)安装serial库:
pip install pyserial
(二)查看串口:ls /dev/ttyS*
(三)打开串口 :
没打开的就命令打开串口:
orangepi-config
System-》Hardware-》uart 基本方法,不过多描述了,官方文档有开启方法的图片描述。
针头尾都可以改动,串口就改/dev/ttyS9
python代码:
import serial
import time
BUFFER_SIZE = 128
def main():
ser = serial.Serial("/dev/ttyS9", 9600)
ser.flushInput()
while True:
if ser.in_waiting > 0:
cmd = ser.readline().decode("utf-8").strip()
print( cmd)
start = cmd.find("head")
end = cmd.find("tail")
if start != -1 and end != -1 and start < end:
data = cmd[start + 4:end]
print("data:", data)
if __name__ == "__main__":
main()
现象:
c代码:
前提是你先安装好wiringpi这个库,额官方文档有讲如何安装wiringpi我不多描述
#include <wiringPi.h>
#include <wiringSerial.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define BUFFER_SIZE 128
int main() {
int fd;
char cmd[BUFFER_SIZE] = {'\0'};
int n_read;
wiringPiSetup();
fd = serialOpen("/dev/ttyS9", 9600);
while (1) {
while (serialDataAvail(fd) <= 0);
n_read = read(fd, cmd, sizeof(cmd));
printf("cmd:%s\n", cmd);
char *start = strstr(cmd, "head");
char *end = strstr(cmd, "tail");
if (start != NULL && end != NULL && start < end) {
char data[BUFFER_SIZE];
memset(data, '\0', sizeof(data));
strncpy(data, start + 4, end - start - 4);
printf("Received data:%s\n", data);
} else {
printf("Invalid data received.\n");
}
memset(cmd, '\0', sizeof(cmd));
}
serialClose(fd);
return 0;
}