我正在通过串口读取微控制器的数据,波特率为921600.我正在读取大量的ASCII csv数据,因为它的速度非常快,所以其余的数据都被丢失了我可以读它.我知道我可以手动编辑serialwin32的pyserial源代码以增加缓冲区大小,但我想知道是否还有另一种方法呢?
我只能估计我将收到的数据量,但它大约是200kB的数据.
我正在尝试使用运行 Angstrom(3.8 内核)的 Beaglebone Black 与位于 9600-N-8-1 的半双工 RS-485 网络上的设备进行通信。
我正在尝试使用与此类似的 RS-485 分线板:https : //www.sparkfun.com/products/10124,但芯片是 MAX3485 http://www.maximintegrated.com/datasheet/index .mvp/id/1079。我购买了预先组装有引脚和端子条的电路板。我的一个朋友用示波器对其进行了测试,并声称 RS-485 板确实可以工作。该板有五个连接到 BBB 的引脚。3-5V(电源)、RX-I、TX-O、RTS 和 GND。
我在 BBB 上禁用了 HDMI 支持,以便UART4_RTSn和UART4_CTSn引脚可用。
mkdir /mnt/boot
mount /dev/mmcblk0p1 /mnt/boot
nano /mnt/boot/uEnv.txt
#change contents of uEnv.txt to the following:
optargs=quiet capemgr.disable_partno=BB-BONELT-HDMI,BB-BONELT-HDMIN
Run Code Online (Sandbox Code Playgroud)
然后我找到了一个覆盖来启用带有 RTS/CTS 控制的 UART-4:
/*
* Modified version of /lib/firmware/BB-UART4-00A0.dtbo to add RTS so we can reset Arduinos
*/
/dts-v1/;
/plugin/;
/ {
compatible = "ti,beaglebone", "ti,beaglebone-black";
part-number = …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用PySerial将数据写入第一个串行端口COM1。
import serial
ser = serial.Serial(0)
print (ser.name)
ser.baudrate = 56700
ser.write("abcdefg")
ser.close()
Run Code Online (Sandbox Code Playgroud)
应该工作。但是,我需要不断发送28个字节的整数。形式
255 255 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000
Run Code Online (Sandbox Code Playgroud)
循环,每个整数使用一个字节的数据。
试:
import serial
ser = serial.Serial(0)
print (ser.name)
ser.baudrate = 56700
while True:
ser.write(255 255 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 …Run Code Online (Sandbox Code Playgroud) 我正在开发一个应用程序,它需要使用pyserial模块将字节数组发送到串行端口.我已成功运行代码在canopy中执行此操作:
import serial
ser = serial.Serial('/dev/ttyACM0', 9600, serial.EIGHTBITS, serial.PARITY_NONE, serial.STOPBITS_ONE)
ser.write([4, 9, 62, 144, 56, 30, 147, 3, 210, 89, 111, 78, 184, 151, 17, 129])
Out[7]: 16
Run Code Online (Sandbox Code Playgroud)
但是当我在Spyder中运行相同的代码(两者都运行Python 2.7.6)时,我收到一条错误消息,如
import serial
ser = serial.Serial('/dev/ttyACM0', 9600, serial.EIGHTBITS, serial.PARITY_NONE, serial.STOPBITS_ONE)
ser.write([4, 9, 62, 144, 56, 30, 147, 3, 210, 89, 111, 78, 184, 151, 17, 129])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/dist-packages/serial/serialposix.py", line 475, in write
n = os.write(self.fd, d)
TypeError: must be string …Run Code Online (Sandbox Code Playgroud) 我有一个RPi (是的,我知道,也许有人认为这属于RPi网站,但我认为它与Linux有关,所以StackOverflow是正确的地方)我正在使用Python3通过MAX485在一些Arduinos之间进行通信和pySerial.这或多或少都有效,因为我发现我需要做一些奇怪的解决方法才能使一切正常"正常".
如果我发送数据:
GPIO.output(23, 1) # Pulling transmit pin high to send
comport.write("Some data".encode()) # Writing data
comport.flush() # Flushing the buffer
GPIO.output(23, 0) # Pulling pin down to receive
Run Code Online (Sandbox Code Playgroud)
Arduino接收数据并立即响应,但由于pySerial尚未准备就绪,它变得什么都没有,我们丢失了数据包.
但是,如果我这样尝试:
GPIO.output(23, 1)
comport.write("Some data".encode())
time.sleep(.001) # Add some delay of only 1ms
comport.flush()
GPIO.output(23, 0)
Run Code Online (Sandbox Code Playgroud)
然后数据被发送并被接收.这引出了一个问题:flush命令是否正常工作?我试了一下:
GPIO.output(23, 1)
comport.write("Some data".encode())
time.sleep(.001) # Add some delay
# -- No flush --
GPIO.output(23, 0)
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是它也有效.似乎睡眠"替换" flush命令.
为什么pySerial的缓冲区没有刷新?我知道,这可能是一种方法,但sleep只添加一个(通常)不必要的代码,导致整个代码等待(超过500行),这不是那么好.
我已经在互联网上搜索过,有些人说它是不支持的USB TTL适配器flush …
我正在尝试通过 Python3 建立双向通信。有一个激光测距仪插入我的一个 USB 端口,我想向它发送/接收命令。我有一张可以发送的命令以及它们会返回什么,所以这部分已经存在了。
我需要的是一种实时进行的便捷方式。到目前为止,我有以下代码:
import serial, time
SERIALPORT = "/dev/ttyUSB0"
BAUDRATE = 115200
ser = serial.Serial(SERIALPORT, BAUDRATE)
ser.bytesize = serial.EIGHTBITS #number of bits per bytes
ser.parity = serial.PARITY_NONE #set parity check: no parity
ser.stopbits = serial.STOPBITS_ONE #number of stop bits
ser.timeout = None #block read
ser.xonxoff = False #disable software flow control
ser.rtscts = False #disable hardware (RTS/CTS) flow control
ser.dsrdtr = False #disable hardware (DSR/DTR) flow control
ser.writeTimeout = 0 #timeout for write
print ("Starting Up Serial …Run Code Online (Sandbox Code Playgroud) 我想使用Crystal lang访问串口.
我在python中有以下代码.我想为宠物项目编写等效的Crystal-lang代码.
import serial
def readSerData():
s = ser.readline()
if s:
print(s)
result = something(s) #do other stuff
return result
if __name__ == '__main__':
ser = serial.Serial("/dev/ttyUSB0", 9600)
while True:
data = readSerData()
#do something with data
Run Code Online (Sandbox Code Playgroud)
我找不到任何用于访问串行端口的库.
在crystal-lang中访问串口的正确方法是什么?
提前致谢.
因此,我正在从串行连接中读取(并使用tkinter文本框显示)数据,但是为了运行测试,我无法按自己的意愿处理返回的数据。用更简单的术语来说,即使machine response = 0x1显示了,我也无法从global读取它serBuffer。
在将其显示给textboxi 之前,我将从测试内部进行读取function,然后检查响应是否在中string,但是现在我将读取的数据(字符串)传递给全局变量,然后尝试读取它,似乎没有工作,除非我serBuffer = ""从中删除了readserial。但是,这导致了一个新问题。当我按下按钮发送命令时,它将发送该命令,但仅在第二次按下后以及每次之后才收到响应。因此,Fail如果我运行一次测试,我会得到一个结果,但是之后我每次都会通过。
带有所需响应的图片(test function不读取0x1并始终返回FAIL)
带有不期望的响应的图片(仅在第二次按下后以及每次之后才收到响应。因此,如果我运行一次测试,则结果为“失败”,但之后每次均得到通过) 。
import tkinter as tk
import serial
from serial import *
serialPort = "COM3"
baudRate = 115200
ser = Serial(serialPort, baudRate, timeout=0, writeTimeout=0) #ensure non-blocking
#make a TkInter Window
mainWindow = tk.Tk()
mainWindow.wm_title("Reading Serial")
mainWindow.geometry('1650x1000+500+100')
scrollbar = tk.Scrollbar(mainWindow)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
log = tk.Text ( mainWindow, width=60, height=60, …Run Code Online (Sandbox Code Playgroud) 我有以下示例代码:
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命令。
我是 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) pyserial ×10
python ×8
serial-port ×5
python-3.x ×4
canopy ×1
crystal-lang ×1
decode ×1
linux ×1
raspberry-pi ×1
rs485 ×1
spyder ×1
tkinter ×1