研究了几天的串口通信,想要实现用Python发送串口信息给Arduino主板控制其他设备
但现在在串口工具里无法检测到Python发出的信息(这个调试工具应该是能够不占用串口监视的),而且下位机也没反应(用Arduino串口监视器测试时是能正常检测到串口的发送和接收)
代码附上
↓Python端
另外Python在运行程序的时候Arudino的Tx指示灯有在闪烁,这证明串口发送是没问题的?
第一次进行串口通信编程,希望得到前辈指正!
参考下:https://www.cnblogs.com/lanceyu/p/10201236.html
Arduino 的码呢?你这直接挑 0 很有问题。
自动选号如:
def findArduino(portsFound):
global arduino_port
commPort = 'None'
numConnection = len(portsFound)
for i in range(0, numConnection):
port = portsFound[i]
strPort = str(port)
print(f'Searching #{i + 1}:\t{strPort}')
if 'Arduino' in strPort or 'CH340' in strPort:
splitPort = strPort.split(' ')
commPort = (splitPort[0])
arduino_port = i
return commPort
Main: connectPort = findArduino(plist)
if connectPort != 'None': serialFd = serial.Serial(port=connectPort, baudrate=115200, timeout=10) print(f'Found Arduino connected to {serialFd.name}')
else: print('Connection Issue!')
对不起,我用 115200 测,应该改回 9600。
谢谢各位大佬!根据一楼大佬的链接终于跑通程序了T^T
但是Python向串口发送数据的时候,串口工具还是无法检测,好奇怪
python:
import serial.tools.list_ports
import serial
import time
def get_ports():
ports = serial.tools.list_ports.comports()
return ports
def findArduino(portsFound):
commPort = 'None'
numConnection = len(portsFound)
for i in range(0, numConnection):
port = portsFound[i]
strPort = str(port)
print(f'Searching #{i + 1}:\t{strPort}')
if 'Arduino' in strPort or 'CH340' in strPort:
splitPort = strPort.split(' ')
commPort = (splitPort[0])
return commPort
def write_read(x):
global serialFd
serialFd.flushInput()
serialFd.write(bytes(x, 'utf-8'))
time.sleep(0.5)
line = 'None'
if serialFd.in_waiting > 0:
line = serialFd.readline().decode('utf-8').rstrip()
return line
# ====================================
# Main
# ====================================
plist = get_ports()
serialFd = None
connectPort = findArduino(plist)
print('Port found: ' + connectPort)
if connectPort != 'None':
serialFd = serial.Serial(port=connectPort, baudrate=115200, timeout=60)
print(f'Found Arduino connected to {serialFd.name}')
else:
print('Connection Issue!')
serialFd.flush()
while True:
num = input("Enter a number: ") # Taking input from user
value = write_read(num)
print(value) # printing the value
arduino:
int x;
void setup() {
Serial.begin(115200);
Serial.println("Ready at 115200 bps:"); // print "Ready" once
Serial.setTimeout(1);
}
void loop() {
if (Serial.available() > 0) {
String c = Serial.readString(); // incoming
Serial.print("I received: ");
Serial.println(c); // outgoing
}
}
上面,我自己的测试结果:
C:\Python38\python.exe D:/Arduino/py/chk_arduino.py
Searching #1: COM9 - USB-SERIAL CH340 (COM9)
Port found: COM9
Found Arduino connected to COM9
Enter a number: 333
I received: 333
Enter a number: No way
I received: No way
Enter a number:
没问题,发什么就收什么。
还有,serial monitor 是无法和 pySerial 合作的。Error: COM port occupied.
打开 serial monitor, pySerial 又无法运行。反正两个是死对头啦!因为两个在抢同一条通道。
串口工具也是用同一条道,pySerial 都已经占位了,怎么能测出来。
除非你自己收集 pySerial 所有的 write=输出 和 read=输入 归纳写成另外一个窗口。用
PyQt5 或者 Kivy 或者 OpenCV 都可以写。