python-读取stm发送的串行数据

时间:2018-09-24 07:07:42

标签: python serial-port

我已经使用python创建了到stm32 usb端口的连接,并希望在按下特定按钮的同时执行一些操作。 (一个发送“ 1”,另一个发送“ 0”)。为什么此解决方案无法按我的意愿工作?

def read():
while True:
    if ser.read(1) == 0:
            print "Zero received" 
            report.send(SET_LEFT())
    if ser.read(1) == 1:
            report.send(SET_RIGHT())
t = threading.Thread(target = read, name = 'thread1')
t.start()

这是关闭端口连接的串行初始化和signal_handler函数。

ser = serial.Serial(
    port='COM7',
    baudrate=9600,
    parity=serial.PARITY_EVEN,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS,
    timeout=0)


def signal_handler(signal, frame):
       ser.close()
       sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)

当我关闭与“ crtl + c”的连接时收到的错误是

Exception in thread thread1:
Traceback (most recent call last):
File "C:\Python27\lib\threading.py", line 801, in __bootstrap_inner
self.run()
File "C:\Python27\lib\threading.py", line 754, in run
self.__target(*self.__args, **self.__kwargs)
File "C:\usbpy\usb_send.py", line 27, in read
if ser.read() == 0:
File "C:\Python27\lib\site-packages\serial\serialwin32.py", line 269, in 
read
win32.ResetEvent(self._overlapped_read.hEvent)
AttributeError: 'NoneType' object has no attribute 'hEvent'

似乎在执行主程序期间未检测到按钮,当我检查与其他python程序的连接和数据时,结果为:link

最好的问候

2 个答案:

答案 0 :(得分:1)

如果没有别的,您的读取功能需要修复。 ser.read(1)值必须存储在变量中,因为您需要对该一次调用中接收到的数据进行多次比较-如对它的编码一样,如果第一个与1比较的结果为false,则另一个ser.read(1 )(即,不同的dat)被生成并与0进行比较,并且也没有将输入存储在变量中意味着您无法通过例如打印收到的值。不明白为什么尝试调试它不会使您将ser.read(1)返回的值存储在变量中,以便可以打印它。

抱歉,无法测试此代码,但它应如下所示:

def read() while True: Thisinput = ser.read(1) print “received”,Thisinput if Thisinput == ‘0’: ... elif Thisinput == ‘1’: ... else: print ‘Input not recognized:%s’%(input) raise Exception(“Invalid input %s”%(Thisinput) )

答案 1 :(得分:0)

我创建了2个变量:

flag_1 = 0
flag_2 = 0

如果在更改标志值的情况下按下按钮,则

def read():

    while True:
        global flaga_1
        global flaga_2
        a=ser.read()
        if a == '0':
                flaga_1 = 1
        elif a == '1':
                flaga_2 = 1

t = threading.Thread(target = read, name = 'thread1')
t.start()

在while循环中,即时消息检测到标志值更改-执行功能并将标志值设置回“ 0”

if flaga_1 == 1:
          report.send(SET_LEFT())
          flaga_1 = 0

elif flaga_2 == 1:
          report.send(SET_RIGHT())
          flaga_2 = 0