我目前正在尝试使用一些我已经连接到arduino uno的电路来设置频谱分析仪,并且我正在尝试通过在python脚本和arduino之间发送确认/确认消息来使接口更健壮。
为了尝试最大化处理速度,我在arduino和脚本中都增加了波特率。
python中的发送消息功能:
def send_command(message, board):
message_dict = {"Setup": '0',
"FFT": '1',
"Audio":'2'}
if message not in message_dict.keys():
raise ValueError("Message not configured on Arduino")
# send message
board.write(message_dict[message].encode())
log.debug("[+] Message Sent: {} ({})".format(message_dict[message], message))
time.sleep(0.2)
#check confirmation:
line = str(board.read(12), "utf-8")
log.debug("[+] Confirmation recieved: {}".format(line))
if message_dict[message] not in line:
raise RuntimeError("Unable to acknowledge message:{}".format(line))
return
board = serial.Serial("/dev/ttyACM0", 115200, timeout=10)
send_command("Audio", board)
和arduino上的C ++代码以接收/确认消息:
void Analyser::read_terminal()
{
int cmd;
if(!Serial.available()) return;
cmd = Serial.read() - '0';
if(cmd <4)
{
mode = static_cast<state>(cmd);
Serial.print("Recieved: ");
Serial.println(static_cast<int>(mode));
}
else
{
Serial.println("Command not recognised");
};
};
mode是一个枚举器类。在我的platformio串行查看器中,所有消息都通过正常处理,即使我将波特率提高到115200,它也可以按我希望的方式发送给我发送的其他数字。当波特率是9600但当波特率提高到115200时,该脚本也可以工作readline总是超时。我也尝试将其更改为read(12),但再次超时。
改变睡眠时间似乎也没有影响。我从python脚本获得的错误消息是:
DEBUG:root:[+] Message Sent: 2 (Audio)
DEBUG:root:[+] Confirmation recieved:
Traceback (most recent call last):
File "....Data Logger/Audio Lock/console_reader.py", line 54, in <module>
send_command("Audio", board)
File ".../Data Logger/Audio Lock/console_reader.py", line 24, in send_command
raise RuntimeError("Unable to acknowledge message:{}".format(line))
RuntimeError: Unable to acknowledge message:
表明什么也没收到。显然,c ++代码很好,因为直接使用串行监视器可以提供所需的结果,但是我不知道如何停止发生此错误。我还尝试在每个程序开始时刷新输入。