本来刚接触python,最近因为疫情无聊把买来好久没用的pyboard v102拿出来自己耍着玩。pyboard用的是micropython针对这块板的“PYB1.0-thread-1.12”这个版本的micropython固件。这个版本的固件是比普通固件多了个多线程功能(虽然据说thread的API开发还不完全)
说明以上原因是我只是偶然遇到并且只在上述环境下发现并测试研究的。闲言少续,说正题。
在说明文档里有关于UART串口的一些说明和示例:
按照示例,我初始化串口的时候就写:
import pyb,NB_IoT,time
def main():
uart = pyb.UART(1,115200)
uart.init(115200,bits=8,parity=None,stop=1)
while True:
if uart.any() != 0:
r = uart.read()
print('接收到串口数据为:',r)
else:
pass
if __name__ == '__main__':
main()
正常这样是没问题的,但是我遇到的问题就在这了。我用一条串口线跟UART1连接好后,用串口助手给pyboard串口发数据,一旦超过64byte 后边就没有了~~~!!! 这把我愁坏了 各种排查代码(因为这会儿已经写了很多代码了)换硬件,各种折腾。整整一个晚上。最后精简到只有上边这一点代码的时候还是不行,也排除了硬件的问题 因为串口助手+串口线直接回路收发都没问题· 主要是不管问度娘还是刷论坛,根本就找不到这个问题是怎么回事啊· 难道只有我遇到了吗·?
在一顿怀疑人生之后,终于被我发现了问题到底TM出在哪了· 因为我之前数过,不管我发多长的内容 最多就能接收到64byte,突然我发现这参数里边有个64呢 咋跟我数的数“碰巧”就一样了呢。示例里边初始化UART的时候这个参数省略了,我也就跟着省略了。但根据下边的解释,这是缓冲区大小的设置。抱着试试的心态,我开始各种研究这个buf(不是buff 哈哈):
经过各种暴力实验,得出结论,在UART初始化的时候如果不给这个参数,直接会被默认为64byte的大小,就像下边介绍的,若设置为0则为禁用。若设置则可用任意大小的正整数。but:这里还有一个我没搞懂的事儿。若我设置read_buf_len=500 并且我的串口真的接收到一个500byte的数据。串口居然会给我拆分成两个256byte的数据。也就是说若接收到大于256byte的数据,将会被拆分成每256byte大小的若干次来接收。我又崩溃了· 不是说万物皆对象吗?
这里我就不上实验的图了,无非就是证明一下我花了一晚上时间来研究了一个碰巧我不懂的白痴问题。
总结:
1、micropython若要串口接收单包大量数据时,一定要设置buf缓存空间的大小。不设置默认只有64byte可能不够。以后的数据将被舍弃。
2、为了方便,尽量将收发的单个UART包大小保持在256byte之内。否则接收时可能会出现意想不到的惊喜。哈哈··
其实我是在用搭载micropython的pyboard上写程序连接移动NB-IoT模块来跟阿里云的IOT平台通信的。最愁人的就是入了阿里的坑,阿里IoT用MQTT协议发送接收数据,而数据验证方面,非常复杂,以至于我串口收发的时候单个包的数据量都特别大。一个简单的接收一个属性值就得一百多字符。你说万一我需要一条通信获取或者设置多个属性。这不就很有可能超过256.到时候又是个麻烦事儿啊· 哎@
啥也不说了 程序员的辛酸泪啊··~~~
在此声明一下,本人是变成行业小白。大学的时候对C语言和数据库等稍稍有一点入门基础(大言不惭),以后一直是仗着对软件和硬件的爱好,在没有任何懂行人帮助下自己在网上搜索、实践、研究学习。所以根本有些是大家可能觉得非常基础谁都应该会的东西我可能都不懂不会。所以以上言论若哪里有错误有纰漏,或者干脆这篇文章看起来可能都是个笑话,请直接绕道即可。