新手求助基于python串口通信程序怎么修改,一直不对报错,各种办法都试过了,还是跑不了(TAT)

yyixx11 2016-02-24 04:41:41
小弟头回在这里发帖,我是用python3.5的idle写的,我的目的就是用usb uart接收发送我板子上的二进制代码到pc,没什么python基础,边学边写还有一堆错误真实太痛苦了,图形界面还好pyserial怎么搞真实要命了,网上看的头晕也没搞出来,麻烦大神帮我看看
from tkinter import*
from tkinter .ttk import*
import sys as sys
import serial
import time
import threading
isOpened = threading.Event()

root = Tk()
root.title('RS serial communication')
txt0 = Text(root,width=80,height=24,border=5)
txt0.pack(side='top')
sec0 = Frame(root,border=4)
sec0.pack(side='top',anchor='w')
sec1 = Frame(root,border=4)
sec1.pack(side='top',anchor='w')
sec2 = Frame(root,border=4)
sec2.pack(side='top',anchor='w')

comx = StringVar(root,'COM4')
Label(sec0,text='com: ').pack(side='left')
Combobox(sec0,text=comx,values=['COM3', 'COM4'],width='12').pack(side='left')

baud = StringVar(root,"9600")
Label(sec0,text=' buad: ').pack(side='left')
Combobox(sec0,textvariable=baud,values=['4800','9600','19200'],width='12').pack(side='left')

dlen = StringVar(root,'8')
Label(sec1,text='data: ').pack(side='left')
Combobox(sec1,textvariable=dlen,values=['9','8','7','6','5','4'],width='12').pack(side='left')

slen = StringVar(root,'1')
Label(sec1,text=' stop: ').pack(side='left')
lst3 = Combobox(sec1,textvariable=slen,values=['1','2'],width='12').pack(side='left')

chck = StringVar(root,'None')
Label(sec1,text=' parity: ').pack(side='left')
lst4 = Combobox(sec1,textvariable=chck,values=['None','Odd','Even'],width='12').pack(side='left')

inpt = StringVar(root,'')
Label(sec2,text='input: ').pack(side='left')
Entry(sec2,width=30,textvariable=inpt).pack(side='left')


isOpened = threading.Event()


ser = serial.Serial()

def COMOpen():
if not isOpened.isSet():
try:
ser.timeout = 1
ser.xonxoff = 0
ser.port = ComX.get()
ser.parity = Chck.get()[0]
ser.baudrate = int(Baud.get())
ser.bytesize = int(Dbit.get())
ser.stopbits = int(Sbit.get())
ser.open()
except Exception:
print ("COM Open Error!")
else:
isOpened.set()
Open.set('close')

else:
ser.close()
isOpened.clear()
Open.set('open serial')

Open = StringVar(root,'open serial')
Button(sec0,textvariable=Open,width=16,command = COMOpen()).pack(side='left')


def Submit():
datain = ser.write(inpt.get())

dataout = ser.read()
txt0.insert(0.0,dataout)

def Clear():
txt0.delete(0.0,END)

Send = StringVar(root,'send')
Button(sec2,textvariable=Send,width=9,command = Submit()).pack(side='left')

Clear = StringVar(root,'clear')
Button(sec2,textvariable=Clear,width=9,command = Clear()).pack(side='left')

root.mainloop()




这里是错误Traceback (most recent call last):
line 79, in <module>
dataout = ser.read()
File "C:\Users\Yin Jinyue\AppData\Local\Programs\Python\Python35-32\lib\site-packages\serial\serialwin32.py", line 263, in read
raise portNotOpenError
serial.serialutil.SerialException: Attempting to use a port that is not open

这是图

有两个按钮send和clear在run的时候消失了
...全文
619 7 打赏 收藏 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yyixx11 2016-02-28
  • 打赏
  • 举报
回复
引用 5 楼 sprawling 的回复:
修改了一下,简单试试还是可以用的. 删
谢谢,我这两天板出问题没法试,这坛子真是比别的论坛热心人多多了
yyixx11 2016-02-28
  • 打赏
  • 举报
回复
引用 4 楼 panghuhu250 的回复:
不要GUI, 直接ser.port="COM4", ..., ser.open(), ser.write(...), print(ser.read())等等, 先保证你serial模块的用法没有问题 (这一部分很适合在python shell中做). 然后再连GUI部分. GUI部分有一些问题:

Button(sec0,textvariable=Open,width=16,command = COMOpen()).pack(side='left')
应该为

Button(sec0,textvariable=Open,width=16,command = COMOpen).pack(side='left')
COMOpen没有括号. COMOpen要在按钮被点击时执行, 而不是建立按钮时执行. submit和clear也一样.

dataout = ser.read()
txt0.insert(0.0,dataout)
应该放到一个函数中, 在适当的时候执行. 现在是程序运行的时候马上就读ser. 以前这儿有人贴过串口控制的脚本, 你可以翻翻老帖子.
谢谢啦,你指出的这几个地方改了之后立刻没错了
sprawling 2016-02-26
  • 打赏
  • 举报
回复
修改了一下,简单试试还是可以用的.
#!/usr/bin/python
# -*- coding:utf-8 -*-


from Tkinter import *
from ttk import *
import sys
import platform
import serial
import time
import threading
import ipdb

#ipdb.set_trace()

running = False

def recevie(obj):
    global running
    print "start rx:\n"
    while(running == True):
        rx_len = obj.inWaiting()
        if(rx_len):
            s0 = obj.read(rx_len)
            print "rx",s0
            txt0.insert(END,s0)
    print "stop rx:\n"

def COMOpen():
    global running
    if not isOpened.isSet():
        try:
            ser.timeout = 1
            ser.xonxoff = 0   
            ser.port = comx.get()
            ser.parity = chck.get()[0]
            ser.baudrate = int(baud.get())
            ser.bytesize = int(dlen.get())
            ser.stopbits = int(slen.get())
            print ser.port
            ser.open()
            running = True
            print running
            t = threading.Thread(target=recevie, args=(ser,))
            t.start()
        except Exception, e:
            print ("COM Open Error!"),e
        else:
            isOpened.set()
            Open.set('close')

    else:
        running = False
        ser.close()
        isOpened.clear()
        Open.set('open serial')


def Submit():
    s1 = inpt.get()
    print s1
#    txt0.insert(END,s1)
    datain = ser.write(s1)


def f_Clear():
    print "delete all"
    txt0.delete(0.0,END)

def test():
    dataout = ser.read()
    txt0.insert(0.0,dataout)
    
            
            
if platform.system() == 'Linux':
	sp_list=['ttyUSBS0', 'ttyUSBS1']
elif platform.system() == 'Windows':
	sp_list=['COM1','COM6']

ser = serial.Serial()

if __name__ == "__main__":
    isOpened = threading.Event()
    
    root = Tk()
    root.title('RS serial communication')
    txt0 = Text(root,width=80,height=24,border=5)
    txt0.pack(side='top')
    sec0 = Frame(root,border=4)
    sec0.pack(side='top',anchor='w')
    sec1 = Frame(root,border=4)
    sec1.pack(side='top',anchor='w')
    sec2 = Frame(root,border=4)
    sec2.pack(side='top',anchor='w')
    
    comx = StringVar(root,sp_list[0])
    Label(sec0,text='com: ').pack(side='left')
    Combobox(sec0,text=comx,values=sp_list,width='12').pack(side='left')
    
    baud = StringVar(root,"9600")
    Label(sec0,text='  buad: ').pack(side='left')
    Combobox(sec0,textvariable=baud,values=['4800','9600','19200'],width='12').pack(side='left')
    
    dlen = StringVar(root,'8')
    Label(sec1,text='data: ').pack(side='left')
    Combobox(sec1,textvariable=dlen,values=['9','8','7','6','5','4'],width='12').pack(side='left')
    
    slen = StringVar(root,'1')
    Label(sec1,text='  stop: ').pack(side='left')
    lst3 = Combobox(sec1,textvariable=slen,values=['1','2'],width='12').pack(side='left')
    
    chck = StringVar(root,'None')
    Label(sec1,text='  parity: ').pack(side='left')
    lst4 = Combobox(sec1,textvariable=chck,values=['None','Odd','Even'],width='12').pack(side='left')
    
    inpt = StringVar(root,'')
    Label(sec2,text='input: ').pack(side='left')
    Entry(sec2,width=30,textvariable=inpt).pack(side='left')

    Send = StringVar(root,'send')
    Button(sec2,textvariable=Send,width=9,command = Submit).pack(side='left')

    Clear = StringVar(root,'clear')
    Button(sec2,textvariable=Clear,width=9,command = f_Clear).pack(side='left')
    
    Open = StringVar(root,'open serial')
    Button(sec0,textvariable=Open,width=16,command = COMOpen).pack(side='left')
    
    isOpened = threading.Event()
    
    root.mainloop()



panghuhu250 2016-02-25
  • 打赏
  • 举报
回复
不要GUI, 直接ser.port="COM4", ..., ser.open(), ser.write(...), print(ser.read())等等, 先保证你serial模块的用法没有问题 (这一部分很适合在python shell中做). 然后再连GUI部分. GUI部分有一些问题:

Button(sec0,textvariable=Open,width=16,command = COMOpen()).pack(side='left')
应该为

Button(sec0,textvariable=Open,width=16,command = COMOpen).pack(side='left')
COMOpen没有括号. COMOpen要在按钮被点击时执行, 而不是建立按钮时执行. submit和clear也一样.

dataout = ser.read()
txt0.insert(0.0,dataout)
应该放到一个函数中, 在适当的时候执行. 现在是程序运行的时候马上就读ser. 以前这儿有人贴过串口控制的脚本, 你可以翻翻老帖子.
yyixx11 2016-02-25
  • 打赏
  • 举报
回复
引用 2 楼 sprawling 的回复:
提示串口打开错误,用测试程序先试试看。
你是说和代码62行一样的COM Open Error!吗?没有连东西肯定阿
sprawling 2016-02-25
  • 打赏
  • 举报
回复
提示串口打开错误,用测试程序先试试看。
yyixx11 2016-02-24
  • 打赏
  • 举报
回复
来个人啊
源码链接: https://pan.quark.cn/s/46590cc698ca 在信息技术领域,特别是在网络应用程序开发和用户界面设计方面,构建支持多选项选择的下拉选择框是一项普遍的需求。常规的下拉选择框往往仅限于让用户选择一个选项,然而,通过定制和扩展,我们能够构建一个能够支持多个选项选择的下拉选择框。以下将对这一主题进行深入探讨。 我们将探讨“支持多选项选择的下拉选择框”的构建方法。这种功能通常应用于用户需要从众多选项中进行选择,而全部选项不可能在页面上完全展示的情况。在这种情况下,一个可进行多选项选择的下拉选择框提供了一种既高效又节省空间的解决方案。描述中提到,这种多选项下拉选择框是通过一个被称为“checkboxlist”的元素构建的,这可能是使用特定的编程语言(如JavaScript、HTML5或特定的前端框架如React、Vue)中的一个组件或控件。 在网络应用程序开发中,实现此类功能通常需要以下步骤: 1. **HTML结构**:构建一个基础的下拉选择框结构,通常使用``元素的样式。 3. **JavaScript交互**:为了实现checkboxlist的效果,通常会运用JavaScript或jQuery来处理用户的交互事件,如点击、键盘操作等,同时更新选定的选项状态。 4. **自定义控件**:在某些场景下,为了获得更佳的用户体验,开发者可能会选择创建自定义的用户控...

37,737

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧