没有合适的资源?快使用搜索试试~ 我知道了~
首页python实现串口通信的示例代码
资源详情
资源评论
资源推荐

python实现串口通信的示例代码实现串口通信的示例代码
主要介绍了python实现串口通信的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有
一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
1 硬件设备硬件设备
TTL串口摄像头(VC0706)
USB转TTL烧录器
2 serial安装安装
第一次安装的是serial的包导包的时候发现下载错了,正确应该是pyserial。安装后直接import就可以了。
3 实现串口通信实现串口通信
3.1 发现端口发现端口
Windows下为COM(N, N=1、2...), Ubuntu下为‘/dev/ttyS0'。Windows初学者,可以给您一下两种方式确定端口号。
方法一:输入在终端(cmd)中输入
python -m serial.tools.list_ports
输出结果:
COM5
1 ports found
方法二:搜索电脑上的设备管理器,打开以后然后插入烧录器,自动就会弹出。如果没有弹出就可能是驱动没有安装,安装好
以后不好使,重启一下电脑,到了工作的时候大家都知道程序员会跟你说,你重启一下,清一下缓存,这两句话。也有可能是
驱动安装的不对。
方法三:直接找一个有端口扫描的上位机,点击扫描就可以了。大部分上位机都是你一插进去就会检测到你的端口。
----->
注意:当串口被占用的时候也有可能导致失败,例如你在编译器有两个进程运行下面的测试代码,第二个进程就会因为端口占
用而失效。也有的上位机是因为同时打开了两个上位机的缘故(实验课的时候同学遇到过情况),可以用任务管理器kill掉。
测试:
import serial
#Windows
ser = serial.Serial(port='COM5', baudrate=115200, timeout=0.5)
print(ser.name)
控制台打印结果:
COM5
Process finished with exit code 0
建立ser对象的代码:
class PicSerial:
__ser = None # ser的单例
__isinit = False
@staticmethod
def get_available_port():
"""

检测可以使用的端口号
:return->str: 端口号的名称
"""
port = list(list_ports.comports())
if len(port) > 0:
port_name = port[0].device
print(port_name)
return port_name
# logging.info("Available port:", ports)
else:
print("There is no available port.")
# logging.error("There is no available port.")
def __new__(cls, *args, **kwargs):
if PicSerial.__ser is None:
cls.__ser = object.__new__(cls)
return cls.__ser
def __init__(self):
if not PicSerial.__isinit:
self.sername = self.get_available_port()
self.ser = serial.Serial(port=self.sername, baudrate=BAUDRATE)
PicSerial.__isinit = False
print("PicSerial init.")
3.2 发送命令发送命令
3.2.1 协议格式
3.2.2 serial传送的方式
serial传送的方式有:
串行端口对象。只传单个字节。字符串。字节数组+字节数组长度。
所以直接选用数组传数据,这里会遇到一个问题就是python的list会自动把十六进制数转换为整形。

所以要进行转换你可以直接写成b“/x56/x00/x17/x00”。假如你不需要传十进制也可以转成list,直接map(chr,x)或
map(ord,x)也是可以的。读的时候也要注意只要你放进list里面就会自动转成整形。
【我觉得这样写很降智,但是又不得不这样写】
#在PicSerial中
def isreply(self, cmd: bytes, option: str) -> bool:
"""
检测是否有回复
:return:回复的内容
:param cmd:
:param option:
:return: True则有回复
"""
if isinstance(cmd, bytes) and isinstance(option, str) and len(cmd) > 0 and len(option) > 0:
self.ser.write(cmd)
reply = self.ser.read(4)
reply = list(map(chr, list(reply)))
print("49h,The function'{}' is running. reply:{}".format(sys._getframe().f_code.co_name, reply))
if len(reply) >= 4 and reply[0] == 'v' and reply[1] == SERIAL_NUM and reply[2] == option and reply[3] == STATUS:
return True
return False
测试:
#在test文件中
class TestSerial(unittest.TestCase):
def test_isreply(self):
self.assertTrue(ser.isreply(GET_VERSION_CMD, VERSION))
self.assertFalse(ser.isreply('\x56\x00\x11\x00', VERSION))
self.assertFalse(ser.isreply(GET_VERSION_CMD, b'\x11'))
self.assertFalse(ser.isreply(123456, b'\x11'))
self.assertFalse(ser.isreply('', VERSION))
self.assertFalse(ser.isreply(b'', VERSION))
self.assertFalse(ser.isreply(GET_VERSION_CMD, ''))
self.assertFalse(ser.isreply(GET_VERSION_CMD, None))
self.assertFalse(ser.isreply(b'', ''))
self.assertFalse(ser.isreply(b'\x56\x00\xAA\x00', VERSION))
self.assertFalse(ser.isreply(GET_VERSION_CMD, '\xAA'))
#之后就省略不写了
if __name__ == '__main__':
unittest.main()
结果:
剩余11页未读,继续阅读














weixin_38515897
- 粉丝: 1
- 资源: 961
上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助

会员权益专享
安全验证
文档复制为VIP权益,开通VIP直接复制

评论0