新手求助基于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的时候消失了
...全文
618 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
  • 打赏
  • 举报
回复
来个人啊
内容概要:本文研究了一种应用于太阳能发电系统的多级逆变器,旨在通过采用正弦脉宽调制(SPWM)技术有效降低输出电压的总谐波失真(THD),从而提升电能质量。研究基于Simulink平台构建了完整的仿真模型,系统地实现了SPWM信号生成、驱动逻辑控制以及多电平输出波形合成等关键环节,验证了该多级逆变器在不同运行工况下具备优异的动态响应能力和稳定性。仿真结果表明,所设计的逆变器能够输出接近理想正弦波的电压波形,显著抑制高次谐波,满足可再生能源并网对电能质量的严苛要求,体现出多级逆变拓扑在光伏发电系统中的技术先进性与工程应用价值。; 适合人群:电气工程、自动化、新能源科学与工程及相关专业的本科生、研究生,以及从事光伏逆变器设计、电力电子变换技术和可再生能源并网系统研发的工程技术人员。; 使用场景及目标:①深入理解多级逆变器的工作原理及其在太阳能发电系统中的关键作用;②掌握SPWM调制技术的理论基础与实现方法,并分析其对改善THD的核心机制;③借助Simulink仿真平台开展电力电子电路的建模、参数调试与性能评估,服务于课程设计、毕业设计、科研课题或实际工程项目开发。; 阅读建议:建议读者结合提供的Simulink仿真模型进行同步操作与验证,细致调整调制比、载波频率等关键参数,观察其对输出波形和THD指标的影响,以深化对系统动态特性的理解,并尝试优化控制策略以进一步提升系统性能。
VCF 生成器 Lite v6.0.0:批量导入与功能拓展 VCF 生成器 Lite v6.0.0 正式版已发布,此次更新带来了批量导入手机通讯录这一重要功能,极大地方便了用户整理和管理联系人信息。同时,新增了多项功能,如翻译所有 CLI 内容,让不同语言背景的用户都能更好地使用;verbose 模式新增更多日志信息,有助于用户更详细地了解操作过程。 此外,还添加了多地区号码格式支持,包括中国港澳台地区电话号码格式,满足了不同地区用户的需求。当未捕获异常时,系统会自动保存错误日志,并引导用户反馈给开发者,这体现了产品团队对用户体验 的重视,有助于及时发现和解决问题。 修复痛点:引号清理与进度条显示问题 在修复方面,此次更新解决了引号清理功能在包含换行符时的错误行为,以及自 `v4.3.0` 版本以来的进度条显示问题。这些问题虽然看似微小,但却影响了用户的使用体验,修复后能让用户更加顺畅地使用 VCF 生成器 Lite。 代码与文档重构:提升可维护性与易用性 在变更方面,将翻译框架迁移到 gettext,提升了 `LANGUAGE` 环境变量 优先级,方便用户根据自己的语言偏好进行设置。在 AI 的指导下重构项目,使得各层次职责更加清晰,代码更加模块化,可维护性更高,这为产品的后续发展奠定了良好的基础。 同时,按 Diataxis 框架重构用户文档,按开发生命周期 重组开发者文档,让用户和开发者都能更方便地获取所需信息,提高了产品的易用性。 编辑观点:VCF 生成器 Lite v6.0.0 的更新在功能、修复和代码文档方面都有显著提升,满足了用户的实际需求,增强了产品的竞争力,未来有望在市场上取得更好的成绩。

37,737

社区成员

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

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