没有合适的资源?快使用搜索试试~ 我知道了~
首页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 方法二:搜索电脑上的设备管理器,打开以后然
资源详情
资源评论
资源推荐
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_38621638
- 粉丝: 1
- 资源: 984
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
- SPC统计方法基础知识.pptx
- MW全能培训汽轮机调节保安系统PPT教学课件.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0