我对python和pyserial很新.我的电脑安装了python 2.7.4与pyserial,我想在我的电脑上的一个单独的窗口打印串行接收的数据.首先必须打开窗口,然后在该窗口上打印串行数据.这里窗口必须打开一次,并且必须在窗口上连续打印串行数据,直到设备停止传送数据为止.我试过这个代码,但它一文不值.请有人帮我提供代码.
import serial
import Tkinter
from Tkinter import *
s = serial.Serial('COM10',9600) # open serial port
master = Tk()
master.geometry("1360x750") # a window pop up with width (1360) and height(750) which exatly fits my monitor screen..
while 1:
if s.inWaiting():
text = s.readline(s.inWaiting())
frameLabel = Frame( master, padx=40, pady =40)
frameLabel.pack()
w = Text( frameLabel, wrap='word', font="TimesNewRoman 37")
w.insert(12.0,text )
w.pack()
w.configure( bg=master.cget('bg'), relief='flat', state='Normal' )
mainloop()
Run Code Online (Sandbox Code Playgroud) 我有一个简单的程序来测试串行功能。我的串行设备对两个输入做出反应。如果用户输入“a”,它会以“fg”响应。如果用户输入任何其他字符/字节,它会以“z”响应。如果我将“b”发送到串行设备,它会返回“z”就好了。当我发送 'a' 时,它应该返回 'f' 和 'g',所以是两个字节而不是一个字节。
请参阅下面的代码。
#!/usr/bin/env python
import serial
ser = serial.Serial(
port = '/dev/ttyUSB0',
baudrate = 9600,
parity = serial.PARITY_NONE,
stopbits = serial.STOPBITS_ONE,
bytesize = serial.EIGHTBITS
)
ser.write('a')
byteData = ser.read(1) # read one, blocking
moreBytes = ser.inWaiting()
if moreBytes:
byteData = byteData + ser.read(moreBytes)
print byteData
print byteData
ser.close()
Run Code Online (Sandbox Code Playgroud)
输出是:
user@ubuntu:~/code/native$ ./serialTesting.py
f
Run Code Online (Sandbox Code Playgroud)
inWaiting() 的值为 0,因此它永远不会读取第二个字节。如果我对代码做一个小的改动,并手动读取两个预期的字节,它就可以正常工作。
#!/usr/bin/env python
import serial
ser = serial.Serial(
port = '/dev/ttyUSB0',
baudrate = 9600,
parity = serial.PARITY_NONE,
stopbits = serial.STOPBITS_ONE,
bytesize …Run Code Online (Sandbox Code Playgroud) 在前几代 USB 调制解调器中,通过使用 Pyserial 并将命令定向到相应的 /dev/USBACM 设备,可以轻松发送 AT 命令。然而,这个华为设备创建了自己的虚拟接口,因此 ifconfig 将其显示为 eth1,而“dmesg | grep tty”并没有真正显示它。所以我的问题是如何使用 python 和 pyserial 发送 AT 命令?谢谢。PS:请随意权衡其他替代方法。
我有一个 Raspberry,我正在尝试连接到 Ubidots IOT 云,但出现以下错误:
pi@raspberrypi:~/Downloads/raspbiDaniela/Ver 2016/ZonrProject $ python main.py
Traceback (most recent call last):
File "main.py", line 124, in <module>
main()
File "main.py", line 21, in main
ser = serial.Serial(port=port, baudrate=baud)
File "/usr/lib/python2.7/dist-packages/serial/serialutil.py", line 261, in __init__
self.open()
File "/usr/lib/python2.7/dist-packages/serial/serialposix.py", line 278, in open
raise SerialException("could not open port %s: %s" % (self._port, msg))
serial.serialutil.SerialException: could not open port /dev/ttyAMA0: [Errno 13] Permission denied: '/dev/ttyAMA0'
Run Code Online (Sandbox Code Playgroud) 我一直在尝试设置此示例片段以通过串行方式与 Python 进行通信。我打算发送一个简单的 JSON 数据包,并在另一端使用 Arduino 对其进行反序列化。
但是从这里获取的 JSON 库会抛出无效输入的错误。
#include <ArduinoJson.h>
void setup() {
Serial.begin(115200);
while(!Serial) {
}
}
void loop() {
int size_ = 0;
char payload[256];
String string = "";
if (size_ = Serial.available()) {
for(int i =0; i < size_; i++) {
payload[i] = Serial.read();
string += payload[i];
}
const size_t capacity = 1024;
DynamicJsonDocument doc(capacity);
DeserializationError error = deserializeJson(doc, payload);
if (error) {
Serial.println(error.c_str());
return;
}
if(doc["operation"] == "ACK") {
Serial.println("ACK has been received"); …Run Code Online (Sandbox Code Playgroud) 一个简单的问题,因为我正在学习通过 python 设置串行连接。我在谷歌上搜索了相应的软件包,在互联网上主要发现了两个:serial和pyserial。
然而,似乎只能找到 的文档pyserial,尽管两者都有很多 stackoverflow 条目。
难道是这个serial包已经改名了pyserial?
好的,所以我对pySerial完全陌生。我正在尝试与一台实验室设备进行通信,但是仅发送STX(文本开始)命令时遇到了麻烦。到目前为止,我的基本代码如下:
ser = serial.Serial(0, 19200, timeout=1,parity=serial.PARITY_ODD, rtscts=0)
ser.write(0x02) #ASCII STX is 0x2 in hex
Run Code Online (Sandbox Code Playgroud)
但是,当我查看示波器上的232数据时,我尝试发送的STX看上去并不像在Hperterminal中发送的STX命令。
有任何想法吗?我确信这是非常简单的,我只是忽略了一些琐碎的事情。
谢谢!
我正在尝试为一个名为uLCD32-pt的LCD设备编写一个脚本,问题是您需要以波特率9600连接它,并且为了获得更高的波特率,您必须连接它,发送更改波特率命令,然后以新设置的波特率发送新命令.在绘制像素时,我的液晶显示器显得非常慢,我知道它因为波特率,所以在连接到设备后,他们有什么方法可以改变波特率?到目前为止,这是我的代码?
import serial
import time
#Connect to uLCD32-pt with autobaud
ser = serial.Serial(
port='/dev/ttyUSB0',
baudrate=9600,
timeout=1,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS
)
ser.write("U")
while(True):
#15 x white pixels
ser.write(chr(0x0050)+chr(0x0000)+chr(0x0001)+chr(0x0000)+chr(0x000A)+chr(0x00FF)+chr(0x00FF))#1
ser.write(chr(0x0050)+chr(0x0000)+chr(0x0002)+chr(0x0000)+chr(0x000A)+chr(0x00FF)+chr(0x00FF))#2
ser.write(chr(0x0050)+chr(0x0000)+chr(0x0003)+chr(0x0000)+chr(0x000A)+chr(0x00FF)+chr(0x00FF))#3
ser.write(chr(0x0050)+chr(0x0000)+chr(0x0004)+chr(0x0000)+chr(0x000A)+chr(0x00FF)+chr(0x00FF))#4
ser.write(chr(0x0050)+chr(0x0000)+chr(0x0005)+chr(0x0000)+chr(0x000A)+chr(0x00FF)+chr(0x00FF))#5
ser.write(chr(0x0050)+chr(0x0000)+chr(0x0006)+chr(0x0000)+chr(0x000A)+chr(0x00FF)+chr(0x00FF))#6
ser.write(chr(0x0050)+chr(0x0000)+chr(0x0007)+chr(0x0000)+chr(0x000A)+chr(0x00FF)+chr(0x00FF))#7
ser.write(chr(0x0050)+chr(0x0000)+chr(0x0008)+chr(0x0000)+chr(0x000A)+chr(0x00FF)+chr(0x00FF))#8
ser.write(chr(0x0050)+chr(0x0000)+chr(0x0009)+chr(0x0000)+chr(0x000A)+chr(0x00FF)+chr(0x00FF))#9
ser.write(chr(0x0050)+chr(0x0000)+chr(0x000A)+chr(0x0000)+chr(0x000A)+chr(0x00FF)+chr(0x00FF))#10
ser.write(chr(0x0050)+chr(0x0000)+chr(0x000B)+chr(0x0000)+chr(0x000A)+chr(0x00FF)+chr(0x00FF))#11
ser.write(chr(0x0050)+chr(0x0000)+chr(0x000C)+chr(0x0000)+chr(0x000A)+chr(0x00FF)+chr(0x00FF))#12
ser.write(chr(0x0050)+chr(0x0000)+chr(0x000D)+chr(0x0000)+chr(0x000A)+chr(0x00FF)+chr(0x00FF))#13
ser.write(chr(0x0050)+chr(0x0000)+chr(0x000E)+chr(0x0000)+chr(0x000A)+chr(0x00FF)+chr(0x00FF))#14
ser.write(chr(0x0050)+chr(0x0000)+chr(0x000F)+chr(0x0000)+chr(0x000A)+chr(0x00FF)+chr(0x00FF))#15
ser.write(chr(0x0050)+chr(0x0000)+chr(0x0010)+chr(0x0000)+chr(0x000A)+chr(0x00FF)+chr(0x00FF))#16
Run Code Online (Sandbox Code Playgroud) 我目前正在尝试在python脚本中捕获串行数据.我打算开始捕获串行端口上捕获的所有数据的日志,同时脚本的其余部分继续与我正在测试的系统交互.
如果我使用pyserial,我相信它最终将阻止我想要执行的其余测试,直到我完成日志记录.
我考虑过的选择是:
我相信我可以找到一种方法让其中任何一种工作,但如果有人知道更直接的方式,那么我很想知道.
先感谢您.
我使用pyserial打开python连接:
self.fpga = serial.Serial(self.fpgaport, 115200, serial.EIGHTBITS, serial.PARITY_NONE, serial.STOPBITS_ONE, self.fpgapollinterval, False, False, None, False, None)
Run Code Online (Sandbox Code Playgroud)
这与此处的pyserial文档匹配:
__init__(port=None, baudrate=9600, bytesize=EIGHTBITS, parity=PARITY_NONE, stopbits=STOPBITS_ONE, timeout=None, xonxoff=False, rtscts=False, writeTimeout=None, dsrdtr=False, interCharTimeout=None)
Run Code Online (Sandbox Code Playgroud)
但是,当我运行脚本时,我收到此错误:
line 391, in run
self.fpga = serial.Serial(self.fpgaport, 115200, serial.EIGHTBITS, serial.PARITY_NONE, serial.STOPBITS_ONE, self.fpgapollinterval, False, False, None, False, None)
TypeError: __init__() takes at most 11 arguments (12 given)
Run Code Online (Sandbox Code Playgroud)
当我取出最后一个参数(最后一个None)时,错误消失了.
如果一个超过1D,我还打印出所有变量名.不是那样的.
我使用的是python 2.6.6,文档是pyserial 2.6.我一直在努力寻找如何找到我正在使用的串口版本.
为什么python声称我提供12个参数,而我只提供11个?我必须在这里遗漏一些东西.
编辑:
如何找到我安装的串口版本?我正在运行的这段代码可能是为另一个版本的python编写的(也是串行编写的).我需要找出我想要的串行版本作为参数.
pyserial ×10
python ×9
serial-port ×2
arduino ×1
at-command ×1
baud-rate ×1
c++ ×1
json ×1
lcd ×1
python-2.7 ×1
raspberry-pi ×1
raspbian ×1
subprocess ×1
tkinter ×1
usb ×1