首页 > 解决方案 > 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);
    }

}

系统的行为是不稳定的。我观察到几件事:

任何人都可以提出什么问题吗?好像是同步问题。

标签: pythonc++armstm32mbed

解决方案


推荐阅读