Python IOError:[Errno 90]消息太长,将长列表传递给SPI函数
我正在使用提供的SPI驱动程序编程,以便将数据发送到LCD。理想情况下,我希望发送一个包含320*240*2(320*240像素每种颜色16位)字节的列表,以便在一个连续写入命令中写入,从而提高速度效率。spi.c和spi_lib.c中的驱动程序有一个8位的tx_len,它将我限制为256字节,所以我将它们修改为32位,这很有效,但现在当我尝试在spi.write(data[:])函数中传递长度超过4096个值的列表时,我收到一个错误。下面是我用来用16位纯色填充屏幕的代码:Python IOError:[Errno 90]消息太长,将长列表传递给SPI函数,python,c,spi,ioerror,Python,C,Spi,Ioerror,我正在使用提供的SPI驱动程序编程,以便将数据发送到LCD。理想情况下,我希望发送一个包含320*240*2(320*240像素每种颜色16位)字节的列表,以便在一个连续写入命令中写入,从而提高速度效率。spi.c和spi_lib.c中的驱动程序有一个8位的tx_len,它将我限制为256字节,所以我将它们修改为32位,这很有效,但现在当我尝试在spi.write(data[:])函数中传递长度超过4096个值的列表时,我收到一个错误。下面是我用来用16位纯色填充屏幕的代码: def FillS
def FillScreen(c):
LCD_SetPos(0, 0, 239, 319)
ch = c>>8 & 0x00FF
cl = c & 0x00FF
d =[]
for x in range (0,76800):
d += [ch, cl]
spi.write(d[:])
这是我在运行函数时遇到的错误:
Traceback (most recent call last):
File "lcd.py", line 205, in <module>
FillScreen(0x00FF)
File "lcd.py", line 200, in FillScreen
spi.write(d[:])
IOError: [Errno 90] Message too long
回溯(最近一次呼叫最后一次):
文件“lcd.py”,第205行,在
填充屏幕(0x00FF)
文件“lcd.py”,第200行,在FillScreen中
spi.write(d[:])
IOError:[Errno 90]消息太长
给出这个错误的代码片段包含在spi.c中
/* Send data */
if(spi_write(fd, tx_buffer, tx_len) < 0){
return PyErr_SetFromErrno(PyExc_IOError);
}
/*发送数据*/
如果(spi写入(fd、tx缓冲区、tx透镜)<0){
返回PyErr_setfromrno(PyExc_IOError);
}
是否有任何方法可以将较长的消息传递给spi.write函数?我对python非常陌生,但对C非常熟悉,请轻松使用我的代码。。。此外,我还尝试循环发送较小的消息以填充屏幕,但这需要花费太长时间。任何帮助都将不胜感激
谢谢,
Michael查看Linux spidev文档中的注释-: (您可以通过
$getconf PAGESIZE
找到您的页面大小-我相信它几乎总是4096字节。)
我还没有测试过,但我认为Maxim的答案应该适合您:,即:
解决方案是在/etc/modprobe.d/local.conf中添加以下行:
options-spidev-bufsiz=
spidev驱动程序默认为4096字节,如果提供了,则使用该参数的值覆盖它-:
将该行放入
/etc/modprobe.d/local.conf
应该在加载spidev模块时将该参数传递给spidev模块-您需要在进行更改后重新启动,以确保已重新加载该模块。查看Linux spidev文档中的注释-:
(您可以通过$getconf PAGESIZE
找到您的页面大小-我相信它几乎总是4096字节。)
我还没有测试过,但我认为Maxim的答案应该适合您:,即:
解决方案是在/etc/modprobe.d/local.conf中添加以下行:
options-spidev-bufsiz=
spidev驱动程序默认为4096字节,如果提供了,则使用该参数的值覆盖它-:
将该行放入
/etc/modprobe.d/local.conf
应该在加载时将该参数传递给spidev模块-在进行更改后,您需要重新启动以确保已重新加载该模块。我找到了一个似乎适合我的解决方案,因为我不知道如何添加Alex描述的“选项”方法哈伊姆。相反,我编写了一个bash脚本来编辑/sys/module/spidev/parameters/bufsiz文件
#!/bin/bash
# Spi Bufsiz Script
cd /sys/module/spidev/parameters
chmod 666 bufsiz
echo 65534 > bufsiz
找到了此解决方案。我找到了一个似乎适合我的解决方案,因为我不知道如何添加Alex Haim描述的“选项”方法。相反,我编写了一个bash脚本来编辑/sys/module/spidev/parameters/bufsiz文件
#!/bin/bash
# Spi Bufsiz Script
cd /sys/module/spidev/parameters
chmod 666 bufsiz
echo 65534 > bufsiz
已找到此解决方案。您还可以使用
cat/sys/module/spidev/parameters/bufsiz
查找当前最大传输大小。您好,Alex,非常感谢您提供此有用信息!!但是,我没有名为/etc/modprobe.d/local.conf的文件=(我的modprobe.d文件夹包含:fbdev-blacklist.conf alsa-base-blacklist.conf alsa-base.conf 8192cu.conf 8188eu.conf cat/sys/module/spidev/parameters/bufsiz确实返回4092…您建议我如何添加该选项?我尝试使用您建议的选项创建一个local.conf文件,但没有任何效果。感谢AgainI找到了一个这个解决方案现在似乎对我有效,因为我不知道如何添加Alex Haim描述的“选项”方法。相反,我编写了一个bash脚本,编辑/sys/module/spidev/parameters/bufsiz文件!/bin/bash#Spi-bufsiz脚本cd/sys/module/spidev/parameters chmod 666 bufsiz echo 65534>bufsiz
,您还可以找到您的t当前最大传输大小与cat/sys/module/spidev/parameters/bufsiz
Hi-Alex,非常感谢您提供的有用信息!!但是我没有名为/etc/modprobe.d/local.conf的文件=(我的modprobe.d文件夹包含:fbdev-blacklist.conf alsa-base-blacklist.conf alsa-base.conf 8192cu.conf 8188eu.conf cat/sys/module/spidev/parameters/bufsiz确实返回4092…您建议我如何添加该选项?我尝试使用您建议的选项创建一个local.conf文件,但没有任何效果。感谢AgainI找到了一个这个解决方案现在似乎对我有效,因为我不知道如何添加Alex Haim描述的“选项”方法。相反,我编写了一个bash脚本,编辑/sys/module/spidev/parameters/bufsiz文件!/bin/bash#Spi-bufsiz脚本cd/sys/module/spidev/parameters chmod 666 bufsiz echo 65534>bufsiz
#!/bin/bash
# Spi Bufsiz Script
cd /sys/module/spidev/parameters
chmod 666 bufsiz
echo 65534 > bufsiz