python - Mbed 5 和 Python 3 在串行上的不稳定行为
问题描述
我创建了一个 Python 3 草图来尝试将当前 NTP 时间上传到 STM32L476RG Nucleo。草图如下:
import serial
import glob
import sys
import time
from socket import AF_INET, SOCK_DGRAM
import socket
import struct
def serial_ports():
""" Lists serial port names
:raises EnvironmentError:
On unsupported or unknown platforms
:returns:
A list of the serial ports available on the system
"""
if sys.platform.startswith('win'):
ports = ['COM%s' % (i + 1) for i in range(256)]
elif sys.platform.startswith('linux') or sys.platform.startswith('cygwin'):
# this excludes your current terminal "/dev/tty"
ports = glob.glob('/dev/tty[A-Za-z]*')
elif sys.platform.startswith('darwin'):
ports = glob.glob('/dev/tty.*')
else:
raise EnvironmentError('Unsupported platform')
result = []
for port in ports:
try:
s = serial.Serial(port)
s.close()
result.append(port)
except (OSError, serial.SerialException):
print("OSError or Serial Exception raised, exiting...")
pass
return result
def getNTPTime(host = "pool.ntp.org"):
port = 123
buf = 1024
address = (host,port)
msg = '\x1b' + 47 * '\0'
# reference time (in seconds since 1900-01-01 00:00:00)
TIME1970 = 2208988800 # 1970-01-01 00:00:00
# connect to server
client = socket.socket( AF_INET, SOCK_DGRAM)
while True:
try:
client.sendto(msg.encode('utf-8'), address)
msg, address = client.recvfrom( buf )
t = struct.unpack( "!12I", msg )[10]
t -= TIME1970
return t
except (socket.gaierror):
print("Error! Internet connection not found, exiting...")
break
my_t_zone = -8
cur_ser = ''.join([s for s in serial_ports() if 'usbmodem' in s])
if(len(cur_ser)>0):
ser = serial.Serial(cur_ser)
if(not ser.isOpen()):
ser.open()
valid = 0
time.sleep(.5)
while(not valid):
ser.reset_input_buffer()
line = ser.readline().decode('utf-8').strip()
if(line=="Hello"):
ntp_time = ("DEA"+str(getNTPTime()+(my_t_zone*3600))+"L").encode('utf_8')
ser.write(ntp_time)
valid = 1
time.sleep(.5)
print("Done uploading time.")
ser.close()
else:
print("No compatible serial device found, exiting...")
在 Nucleo 板上运行的 Mbed 草图如下:
#include "mbed.h"
Serial pc(USBTX, USBRX);
const int kMaxBufferSize = 100;
char buffer[kMaxBufferSize];
int len = 0;
int contact = 1;
void removeChar(char *s, int c){
int j, n = strlen(s);
for (int i=j=0; i<n; i++)
if (s[i] != c)
s[j++] = s[i];
s[j] = '\0';
}
int main()
{
pc.baud(9600);
while(contact) {
pc.printf("Hello\n");
if (pc.readable() > 0) {
char new_char;
while(new_char != 'L') {
new_char = pc.getc();
buffer[len++] = new_char;
}
contact = 0;
}
}
removeChar(buffer, 'D');
removeChar(buffer, 'E');
removeChar(buffer, 'A');
removeChar(buffer, 'L');
int x = atoi(buffer);
while(!contact) {
pc.printf("%s\n",buffer);
}
}
系统的行为是不稳定的。我观察到几件事:
- 大多数情况下,此代码片段工作正常,Mbed 在解析后正确显示上传的 Posix 时间戳。
- 有时会在解析的时间戳中显示错误的字符(例如符号和其他字符)
- 有时 Mbed 不会显示整个 posix 时间戳并被删除。
- 此外,您可以看到 Python 代码在时间戳之前上传了三个字符。这些用于确保代码在大部分时间都能正常工作(即,如果没有它们,时间戳的前两位数字大部分时间都会被删除)。
任何人都可以提出什么问题吗?好像是同步问题。
解决方案
推荐阅读
- ios - 在表/集合视图控制器及其关联的 diffable 数据源子类之间共享数据模型的好方法是什么?
- angular - 在 Angular 中,我是在子组件中使用父组件的方法还是使用服务?
- angular - 以角度显示循环
- db2 - SQL DB2:声明临时表添加列
- mysql - 唯一表约束
- python - 如何用 numpy 数组替换文件的一部分
- python - 在 YAML 中为嵌套键设置值
- r - 如何对矩阵或数据框中的值进行混洗,以使每个值在每行/列中仅出现一次?
- clean-architecture - 存储库如何依赖于用例清洁架构
- amazon-web-services - 在 cloudwatch 中使用单个指标创建指标数学警报