我正在使用while循环读取串行数据.但是,我无法控制采样率.
代码本身似乎需要花费0.2秒才能运行,所以我知道我将无法以更快的速度运行.但我希望能够准确控制我采样的速度.
我觉得我可以使用'sleep'来做到这一点,但问题是有可能在不同的点上循环本身需要更长的时间来读取(取决于通过串行数据传输的精确内容),所以代码会有弥补平衡.
例如,假设我想每1秒采样一次,并且循环需要0.2s到0.3s才能运行.我的代码需要足够智能才能睡眠0.8秒(如果循环需要0.2秒)或0.7秒(如果循环需要0.3秒).
import serial
import csv
import time
#open serial stream
while True:
#read and print a line
sample_value=ser.readline()
sample_time=time.time()-zero
sample_line=str(sample_time)+','+str(sample_value)
outfile.write(sample_line)
print 'time: ',sample_time,', value: ',sample_value
Run Code Online (Sandbox Code Playgroud) 我有一个简单的 Python 代码,它通过串行端口使用串行通信连接到 Arduino 板。
我正在使用 Python 库“pyserial”。它是Python2.7
我创建了一个连接,基本上是在做类似的事情
ser = serial.Serial("/dev/ttyACM0", 115200)
Run Code Online (Sandbox Code Playgroud)
在此之后,我使用 serial.write 向我的 arduino 板发送命令。我有一个自制的固件,可以读取命令并移动一些电机。
此代码正在运行,目前正在运行。虽然我每天连接和断开几次连接和我的机器人做一些事情。我总是刷新所有东西(serial.flush)。在某些时候,它只是失败了。它似乎连接,但没有执行任何操作。就像在某个时候串行端口损坏了一样。
一旦我重新启动计算机,一切正常。
知道如何在不重新启动计算机的情况下修复它吗?
拔下 USB 电缆不起作用。
我有以下示例代码:
import serial
ser = serial.Serial('/dev/ttyUSB1', 115200, timeout=5)
ser.write("AT\r")
response = ser.readline()
ser.write(chr(26))
ser.close()
print response
Run Code Online (Sandbox Code Playgroud)
我的目标是发送AT命令并得到您的回答OK。
PySerial readline()的文档说读取接收到的数据,直到找到换行符,问题是我的打印没有返回任何内容。
我确定在AT命令之后,3G 调制解调器发送给我的响应是OK。任何人都知道您无法检索答案的原因?
PS:使用像CuteCom这样的程序,我确认设备可以工作并且它响应AT命令。
最近,我试图对Arduino进行"轻控制".我使用Raspberry Pi通过串口(USB线)发送控制消息.这是Arduino代码:
int redled = 12;
int whiteled = 48;
void setup()
{
Serial.begin(9600);
pinMode(redled,OUTPUT);
pinMode(whiteled,OUTPUT);
}
void loop()
{
if(Serial.available())
{
char cmd = Serial.read();
switch(cmd)
{
case'r':
digitalWrite(redled,HIGH);
delay(2000);
digitalWrite(redled,LOW);
break;
case'w':
digitalWrite(whiteled,HIGH);
delay(2000);
digitalWrite(whiteled,LOW);
break;
}
}
else
{
Serial.println("hello pi");
delay(1000);
}
}
Run Code Online (Sandbox Code Playgroud)
之后,我使用Python解释器的pySerial来控制引脚,一切都运行正常.这是一个解释器输出:
Python 2.7.3 (default, Mar 18 2014, 05:13:23)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import serial
>>> ser = serial.Serial('/dev/ttyACM0',9600)
>>> x = ser.read(10)
>>> …Run Code Online (Sandbox Code Playgroud) 尝试使用Python 2.7与Arduino串行端口通信.已下载pyserial 2.7(在python应用程序文件夹中解压缩并放置文件夹pyserial文件夹).没有工作的错误信息."没有名为pyserial的模块".
对如何从终端安装感到困惑.非常感谢任何帮助.
我是 Python 的初学者。我有一个使用 pyserial 库与串行设备通信的程序。程序向机器发送一个字节的数字并接收字节数作为回复。
我的代码是
import serial, string
port = serial.Serial("COM9", 38400, timeout=10.0)
serial.PARITY_NONE
serial.EIGHTBITS
serial.STOPBITS_ONE
port.write(bytes([53, 1, 4, 0, 83]))
print("Write done")
data = port.read(20)
data1= data.decode('utf-8')
print(data1)
Run Code Online (Sandbox Code Playgroud)
输出是
Write done
Traceback (most recent call last):
File "C:\Python34\serialcomm.py", line 18, in <module>
data1= data.decode('utf-8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x84 in position 8:
invalid start byte
Run Code Online (Sandbox Code Playgroud)
输出应该是 [53,1,4,0,83,53,1,63,83]
如果我排除解码,我得到
Write done
b'5\x01\x04\x00S5\x1b\x00\x84S'
Run Code Online (Sandbox Code Playgroud) 以前interCharTimeout,从3.0版开始inter_byte_timeout.
API:http://pyserial.readthedocs.org/en/latest/pyserial_api.html#serial.Serial.inter_byte_timeout
我怀疑以下是常规timeout和inter_byte_timeout以下之间的区别:
我这是对的吗?
我怀疑没有,因为我只是无法使功能超时.我试过下面的例子.我期待inter_byte_timeout能够读取并打印一个"字符串",因为它们是由arduino写的,每秒一个.相反,它每三秒超时一次,然后打印那段时间内的内容.
写入序列的Arduino草图:
void setup() {
Serial.begin(9600);
while(!Serial); //wait for connection
for (int i=0;true;i++){
Serial.printf("=== iteration %d ===\n", i);
delay(1000); //ms
}
}
void loop() {
}
Run Code Online (Sandbox Code Playgroud)
Python脚本:
import serial
ser=serial.Serial(port='/dev/ttyACM0', timeout=3,inter_byte_timeout=0.01)
for i in range(100):
a = ser.read(10000)
print i, len(a), repr(a)
Run Code Online (Sandbox Code Playgroud)
命令行输出:
~$ python test.py
0 60 '=== iteration 0 ===\n=== iteration 1 ===\n=== iteration 2 ===\n'
1 60 …Run Code Online (Sandbox Code Playgroud) 我有Windows 7 64位和Python 3.6
我实际上是在挖掘整个网络来解决这个问题 - 而且没有什么可悲的.
AttributeError Traceback (most recent call last)
<ipython-input-150-80ee8bd5f0f2> in <module>()
----> serial.Serial()
AttributeError: module 'serial' has no attribute 'Serial'
Run Code Online (Sandbox Code Playgroud)
我尝试通过以下方式解决这个问题: - 检查我的文件是否名为serial.py - 重新安装模块 - 首先,整个模块不起作用,现在只有它的功能. - 我不能使用它的任何功能,检查端口不起作用,没有什么工作. - 我检查了我的点 - 一切都很好,模块在文件夹site-pacages. - 如果我在pySerial文件中执行一些代码 - 它可以工作.但是没有serial.Serial或连接COM端口(我尝试这样做.)
我需要使用串行端口与某些设备进行通信。我知道这个设备参数(boudrate 等)。我也知道这个设备会一直等到它收到一个换行符(我不知道 unix 或 windows 类型),然后用 ASCII 发回一些东西。
问题是,当我想写任何东西时,脚本会挂起。没有错误发生,只是以后什么都没有发生。无法打印任何内容,甚至无法关闭端口。
我该如何解决?
它不适用于真正的基本脚本。当然,这不是一个完整的代码,只是一个示例来说明什么不起作用。
可悲的是,我没有找到任何有效的解释或答案。
我正在使用 Ubuntu 16.04
谢谢你的帮助!
import serial
ser = serial.Serial(
port="/dev/NameOfDevice",
baudrate=115200,
bytesize=8,
parity='N',
stopbits=1,
timeout = 0)
ser.open()
print('Port was opened')
ser.write(b'\r\n') #this is a line where it stops working. Different inputs were tried, nothing works.
print('Does it works?')
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个简单的 python 脚本,将 gcode 命令发送到运行 Marlin 的 wanhao D9 主板打印机。我在通过 USB 连接到打印机的树莓派上运行 python 脚本。
import serial
ser = serial.Serial("/dev/ttyUSB0", 115200)
ser.write("G28\n")
Run Code Online (Sandbox Code Playgroud)
我已经阅读了 20 多个有类似问题的论坛页面,并尝试了他们的答案,例如将波特率更改为 250000 以及对 write 函数参数进行以下更改:
ser.write("G28\r\n")
ser.write(b'G28\r\n')
ser.write(b'G28\n')
ser.write(b'G28')
ser.write("G28")
Run Code Online (Sandbox Code Playgroud)
我已经尝试了所有这些组合,并且我还添加了:
time.sleep(5)
Run Code Online (Sandbox Code Playgroud)
以及我文件顶部的时间模块的相关导入语句。我在 ser 声明和 ser.write 函数调用之间添加了这行代码。
我也尝试添加:
ser.close()
Run Code Online (Sandbox Code Playgroud)
看看这是否会有所作为,但事实并非如此,因为我知道这无论如何都是最佳实践。
无论我使用什么代码组合,当我运行我的 python 脚本时,我的打印机似乎重新启动(屏幕从主页变为打开的 wanhao 徽标并返回主页)
我期待任何人都可以就我的代码以及我可能做错的事情向我提供任何帮助。
pyserial ×10
python ×10
serial-port ×4
arduino ×2
3d-printing ×1
decode ×1
g-code ×1
python-2.7 ×1
python-3.6 ×1
raspberry-pi ×1
ubuntu-16.04 ×1
usb ×1
while-loop ×1