没有合适的资源?快使用搜索试试~ 我知道了~
首页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
- 粉丝: 2
- 资源: 961
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- 27页智慧街道信息化建设综合解决方案.pptx
- 计算机二级Ms-Office选择题汇总.doc
- 单链表的插入和删除实验报告 (2).docx
- 单链表的插入和删除实验报告.pdf
- 物联网智能终端项目设备管理方案.pdf
- 如何打造品牌的模式.doc
- 样式控制与页面布局.pdf
- 武汉理工Java实验报告(二).docx
- 2021线上新品消费趋势报告.pdf
- 第3章 Matlab中的矩阵及其运算.docx
- 基于Web的人力资源管理系统的必要性和可行性.doc
- 基于一阶倒立摆的matlab仿真实验.doc
- 速运公司物流管理模式研究教材
- 大数据与管理.pptx
- 单片机课程设计之步进电机.doc
- 大数据与数据挖掘.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0