一、环境搭建

1.概述

本文主要是通过Python3与CAN总线工具PCAN-USB基于官方PCAN-Basic库实现CAN总线消息读写功能。

2.PCANBasic.py和PCANBasic.dll下载地址

https://www.peak-system.com/fileadmin/media/files/pcan-basic.zip

3.Python安装

下载地址:https://www.python.org/ftp/python/3.7.9/python-3.7.9-amd64.exe

二、项目展示

1.文件目录

2.xmt文件内容

3.CAN消息读取截图

4.CAN消息发送截图

三、完整代码

#!/usr/bin/python
# _*_ coding:utf-8 _*_
from PCANBasic import *
from queue import *
import threading, time, osclass PcanOperate(PCANBasic, threading.Thread):def __init__(self):super().__init__()  # 继承父类的init方法result = self.Initialize(PCAN_USBBUS1, PCAN_BAUD_500K)  # 总线初始化if result != PCAN_ERROR_OK:print(self.GetErrorText(result))  # 发生错误,获取错误信息else:print("PCAN-USB 已初始化")def ProcessMessage(self, msg, timestamp):"""CAN消息处理方法"""msg_dict = {}msg_id = hex(msg.ID)if len(msg_id[2:]) == 7:msg_dict["CANID"] = '0' + msg_id[2:].upper()else:msg_dict["CANID"] = msg_id[2:].upper()msg_dict["MSGTYPE"] = msg.MSGTYPEmsg_dict["LEN"] = msg.LENdata = ''for i in range(8):if len(hex(msg.DATA[i])[2:]) == 1:d = ' ' + '0' + hex(msg.DATA[i])[2:].upper()else:d = ' ' + hex(msg.DATA[i])[2:].upper()data += dmsg_dict["DATA"] = data[1:]timestamp_dict = {}timestamp_dict['millis'] = timestamp.millistimestamp_dict['millis_overflow'] = timestamp.millis_overflowtimestamp_dict['micros'] = timestamp.microstime_sum = timestamp.micros + 1000 * timestamp.millis + 0x100000000 * 1000 * timestamp.millis_overflowreturn msg_dictdef PutQueue(self):"""从总线中读取CAN消息及其时间戳,并放入队列。"""while True:"""检查接收队列是否有新消息"""readResult = self.GetStatus(PCAN_USBBUS1)if readResult != PCAN_ERROR_OK:result = self.GetErrorText(readResult)print(result[1])event2.set()else:readResult = self.Read(PCAN_USBBUS1)  # 接收总线报文time.sleep(0.01)if readResult[0] != PCAN_ERROR_QRCVEMPTY:print("消息入队")q.put(self.ProcessMessage(readResult[1], readResult[2]))  # 消息入队event1.set()else:result = self.GetErrorText(readResult[0])print(result[1])event2.set()breakdef GetQueue(self):"""从队列中获取信息"""while True:if event2.is_set():breakif not q.empty():event1.wait()print(q.get())  # 消息出队def GetXmtMsg(self):"""获取xmt文件中需要发送的消息"""with open(os.path.join(os.getcwd(), 'zuidazhi.xmt'), 'r+') as f:fo = f.readlines()allcandata = []for i, j in enumerate(fo, start=1):onecandata = {}if i > 14:f1 = j.strip().split()if len(f1) == 14:  # 获取长度为8的dataonecandata['cycle'] = (int(f1[3]))msg = TPCANMsg()msg.ID = int(f1[1][:-1], 16)msg.MSGTYPE = PCAN_MESSAGE_EXTENDEDmsg.LEN = int(f1[4])msg.DATA[0] = int(f1[6][:-1], 16)msg.DATA[1] = int(f1[7][:-1], 16)msg.DATA[2] = int(f1[8][:-1], 16)msg.DATA[3] = int(f1[9][:-1], 16)msg.DATA[4] = int(f1[10][:-1], 16)msg.DATA[5] = int(f1[11][:-1], 16)msg.DATA[6] = int(f1[12][:-1], 16)msg.DATA[7] = int(f1[13][:-1], 16)onecandata['msg'] = msgallcandata.append(onecandata)return allcandatadef CanWrite(self):"""发送CAN消息"""allcandata = self.GetXmtMsg()print(allcandata)if len(allcandata) > 0:for i in allcandata:result = self.Write(PCAN_USBBUS1, i['msg'])currenttime = int(round(time.time() * 1000))i['currenttime'] = currenttimeif result != PCAN_ERROR_OK:result = self.GetErrorText(result)print(result)else:print("时间戳记录成功")time.sleep(1)while True:currenttime = int(round(time.time() * 1000))for i in allcandata:interval = currenttime - i['currenttime']if interval >= i['cycle']:result = self.Write(PCAN_USBBUS1, i['msg'])  # 写if result != PCAN_ERROR_OK:result = self.GetErrorText(result)print(result)else:print("消息发送成功")i['currenttime'] = currenttimedef __del__(self):result = self.Uninitialize(PCAN_USBBUS1)  # 总线释放if result != PCAN_ERROR_OK:result = self.GetErrorText(result)print(result[1])else:print("PCAN-USB 已释放")if __name__ == '__main__':q = Queue()event1 = threading.Event()event2 = threading.Event()pcan = PcanOperate()# s1 = threading.Thread(target=pcan.CanWrite, name="发送CAN消息线程")# s1.start()s2 = threading.Thread(target=pcan.PutQueue, name="读取CAN消息并放入队列线程")s2.start()s3 = threading.Thread(target=pcan.GetQueue, name="从队列中读取CAN消息线程")s3.start()

Python3+PCAN-USB基于PCAN-Basic二次开发实现上位机功能相关推荐

  1. 据说这是熟练掌握python的爷们_dongbei 是一门基于 Python 3 二次开发的东北方言编程语言...

    dongbei - 东北方言编程语言 学编程,就整东北浪! 体格咋地 扫码关注原作者微信公众号"老万故事会": 引言 dongbei是啥?它是一门以东北方言词汇为基本关键字的以人为 ...

  2. CANanlystII 基于python的二次开发实践

    前期,我已经编写过一篇<CANanlystII 基于linux的二次开发实践>这篇博客承接上一篇博客,所以背景知识和测试场景,就不再赘述. 背景知识和测试场景,可以查阅如下: CANanl ...

  3. java二次开发浏览器内核_深入理解基于Selenium的二次开发

    对于做web端自动化测试的人来说,可能接触selenium比QTP还要多,但是我们在做基于selenium的二次开发的时候,经常会说到二次开发是 为了易于维护,很多人可能不懂得维护的价值是什么,和到底 ...

  4. Vue+Vant 基于DatetimePicker进行二次开发,实现yyyyMMdd hh:mm:ss时间选择

    Vue+Vant 基于DatetimePicker进行二次开发,实现yyyyMMdd hh:mm:ss时间选择 1.效果图 2.前提 3.项目结构 4.index.vue 5.timeSelectio ...

  5. 基于Visio的二次开发

    基于Visio的二次开发 前一段时间,由于项目的需要:学习了一些关于Visio二次开发的知识:现在工具基本成形了,也算告一段落了:因此想总结一下关于Visio的二次开发的一些基本知识: 对于基于Vis ...

  6. WordPress主题 Vieu主题V4.5无授权无限制版 基于Dux主题二次开发 完美运行

    模板简介: WordPress主题vieu基于Dux主题二次开发!的一款专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板.适用范围:wordpress主题.WordPres ...

  7. 海康威视多摄像头实时视频预览(基于SDK的二次开发)

    项目背景 很久没有做工程项目了,最近突然接单,要做多摄像头下运动物体入侵检测及拌线检测,本文测试用到的摄像头是海康威视的DS-2CD23**D摄像头. 环境配置: 1.下载SDK 2.vs2010开发 ...

  8. office 文件在线协作编辑——解决方案1(基于sharepoint的二次开发)

    概述 office 文件在线协作编辑主要是指word.excel.ppt的多人在线协作编辑,实时同步的功能: 这里主要介绍解决方案之一--基于sharepoint的二次开发(还可以基于wopi实现)的 ...

  9. 【基于蜂鸟地图二次开发工具,方便开发者快速开发业务】

    基于蜂鸟地图二次开发工具 lmfmap v0.0.1 开发 lmfmap v0.0.1 基于蜂鸟地图二次封装的工具,让开发者用最少的代码开发自己的业务,让业务和地图解耦,业务提供数据地图提供接口交互 ...

  10. 基于CANoen协议实现DSP系统与上位机CAN的通讯

    转 基于CANoen协议实现DSP系统与上位机CAN的通讯 电子设计•来源:郭婷•作者:电子设计 • 2019-07-10 08:08 • 1103次阅读 1.引言 CANopen是一个开放的.标准化 ...

最新文章

  1. 第一课.Linux系统的介绍与ubuntu虚拟机安装
  2. MySQL的用户和授权
  3. 一个很有借鉴价值的编程故事(转)
  4. Linux学习之七--mysql的安装使用
  5. webform计算某几列结果_工业CAE案例实战精选|脱硫吸收塔工艺仿真计算系统
  6. 一文读懂 JavaScript 和 Python 九大语义区别
  7. Response.Redirect在新窗口打开
  8. access查询女教师所有的信息_access数据综合查询
  9. 二阶采样matlab程序,Sea-clutter-simulation 海杂波仿真程序,包括单基地雷达和双 的一阶、二阶 matlab 272万源代码下载- www.pudn.com...
  10. C#使用WebProxy实现代理访问webservice
  11. 树莓派外接网卡实现监听wifi
  12. 计算机用户域怎么删除,如何删除域内非活动计算机账号?
  13. 大学生笔记本选Mac还是Windows?
  14. 台式计算机的安装顺序,台式电脑安装步骤教程
  15. react之事件绑定(this、传参)
  16. 博士申请 | 澳大利亚麦考瑞大学王岩教授招收机器学习方向全奖博士生
  17. LeetCode 0417「太平洋大西洋水流问题」
  18. Java声效计算器(带有十进制转二进制和十六进制的功能)
  19. FHQ Treap【基于P3369的讲解】【随机数、各数组、函数运用】
  20. 特征融合的作用与手段

热门文章

  1. 色彩设计原理(里面有配色方案,也有配色网站)
  2. python14张图下载_Python网络爬虫入门(三)—— 做个简陋的pixabay 图片下载器 (附源码)...
  3. 人声歌姬语音合成器+11个歌手音源-Yamaha Vocaloid 5.2.1 + Libraries WiN
  4. 重要文件即时搞定,不用插电就能打印,汉印MT800移动便携打印机上手
  5. [渝粤教育] 山东工商学院 电机与拖动基础 参考 资料
  6. 最小二乘法(least squares)的曲线拟合(curve fitting)
  7. 微信公众号群发接口和原创校验
  8. vp9 prob 详细分析
  9. 主流编解码器(H.264 AVC, H.265 HEVC, VP8, VP9)比较
  10. Python学习路线