Python_Example_CAN转RS-485实现程序

2018-09-12

Author: 楚格

IDE: Pycharm2018.02   Python 3.7   

KeyWord :  CAN模块

Explain:

多级选择,后续待优化

 

 

1------------------------------------------------------------------------------------------------------------------

--

__all__ = []

import sys
import os

import re
import string
import binascii
import array
import signal
from time import sleep

import serial
import time
import pprint
from collections import OrderedDict  # 字典元素有序排列

# =========================================



'''
# ------------------------------------------
# 导入:本文件夹中 .py 模块
# 直接引用模块名称
# ------------------------------------------
'''
#preject module
from Testing_CRC import *


'''
# ======================================
# 串口读取
# ======================================
'''

global MAX_LOOP_NUM
global newCmd
MAX_LOOP_NUM = 0


#========================================================
'''
# ======================================
# 输入函数  函数
# ======================================
'''
# def Input_AT_CMD(AT_CMD):
#     print('输入函数  Input_AT_CMD')
#
#     print('AT_CMD :', len(AT_CMD), type(AT_CMD), AT_CMD)
#     AT_CMD_Handle = AT_CMD
#
#     result = AT_CMD_Handle
#
#     return AT_CMD_Handle



'''
# ======================================
# 校验函数  函数
# ======================================
'''
def Modbus_CRC():
    print('校验函数 Modbus CRC')

    global crc_value

    # ========================================================
    # 输入列表值 字节  临时

    Local_AT = 2

    if   Local_AT == 1 :
        # 测试
        crc_value = [0x01, 0x04, 0x13, 0x87, 0x00, 0x30]

    elif Local_AT == 2 :
        # SN
        crc_value = [0x01, 0x04, 0x13, 0x7e, 0x00, 0x0A]

    else:
        print('AT指令超出范围')

    # crc_value = AT_crc

        # CRC 校验 添加校验码
    crc_transformation = CalCRC16(crc_value, len(crc_value))      # 核心步骤
    print('crc_transformation: ',crc_transformation, type(crc_transformation)) # Int没有Len

    crc_calculation = hex(crc_transformation)
    print('crc_calculation   : ',crc_calculation, type(crc_calculation))

        # 注意添加先后顺序 先低 后高
    crc_value.append(int(hex(crc_transformation        & 0xFF), 16))
    crc_value.append(int(hex((crc_transformation >> 8) & 0xFF), 16))
    print('crc_value         : ',len(crc_value), type(crc_value), crc_value)  # calculation value   CRC

    '''
    # 本区域是上述语句的分解
    # tasd = [0x00, 0x00]     # 申明 初始化变量
    # tasd[0] =  crc_transformation       & 0xFF
    # tasd[1] = (crc_transformation >> 8) & 0xFF
    # H = hex(tasd[0])
    # L = hex(tasd[1])
    # H_value = int(H, 16)
    # L_value = int(L, 16)
    # crc_value.append(H_value)
    # crc_value.append(L_value)
    '''
    print('\n')
    # ========================================================
    # CRC 校验再次检查
    CRC_Check = CheckCRC(crc_value, len(crc_value),0)

    if CRC_Check == 1:
        print('Result    :', CRC_Check)  # check calculation value
        print('CRC_Check : Right')
    else:
        print('Result    :', CRC_Check)  # check calculation value
        print('CRC_Check : wrong')

    print('\n')
    # ========================================================
    # 返回添加后的CRC值
    return crc_value

    # ========================================================

'''
# ======================================
# 串口设置  函数
# ======================================
'''
def Serial_info():
    print('串口初始化  Serial_info')
    #-----------------------------

    global ser, band

    Local_func =True
    while Local_func:
        print("默认请输入:1  \n重新输入为:2")
        default = input('您的请选择:  ')

        if default == "1":
            ser = serial.Serial(port="COM5", baudrate=115200, timeout=1)  # 端口控制
            Local_func = False  # 结束执行

        elif default == "2":
            port = input('串口号(数字): ', ) # 查看端口号

            Local_xuhao = True

            while Local_xuhao:
                print('可选波特率:1 = 9600 \n\t\t 2 = 115200')
                band = input('波特率序号: ')

                if band == "1":
                    band = 9600
                    Local_xuhao = False
                elif band == "2":
                    band = 115200
                    Local_xuhao = False
                else:
                    print('超出范围:请重新选择波特率!')
                    Local_xuhao = True
                # 组装成串口初设信息
            ser = serial.Serial(port="COM" + port, baudrate=band, timeout=1)  # 端口控制
            Local_func = False  # 结束执行
        else:
            print('超出选择范围,请重新选择序号!')
            Local_func = True #返回继续执行

    # AT = 'Slave:GetConfig'
    # AT = bytearray([0x01,0x04,0x13,0x87,0x00,0x30,0x44,0xB3])
    # AT = bytes([0x01,0x04,0x13,0x87,0x00,0x30,0x44,0xB3])
    # AT  = bytearray(crc_value)

    AT  = bytes(crc_value)

    sendAT_Cmd(ser, AT, 1)

'''
# ======================================
# 发送指令 函数
# ======================================
'''
def sendAT_Cmd(serInstance, atCmdStr, waitforOk):
    print('发送指令函数  send_cmd')
    #---------------------------
    # print("Instance: %s" % serInstance) # 打开串口的信息
    print("Command : %s" % atCmdStr)    # 发送的指令
    print("Port    :",ser.port)         # 端口号

        #  判断是字符串还是字节
        #  or define b'string',bytes should be used not str
    # serInstance.write(atCmdStr.encode('utf-8'))

    # in_bytes = atCmdStr.encode(atCmdStr)
    serInstance.write(atCmdStr)



    if (waitforOk == 1):
        waitForCmdOKRsp()
    # else:
    #     waitForCmdRsp()


'''
# ======================================
# 等待回复  函数
# ======================================
'''
def waitForCmdOKRsp():
    print('等待回复函数  waitForCmdOKRsp')
    #----------------------------------
    maxloopNum = 0
    global Reveice_Value

    while True:
        line = ser.readline()   # 读取全部内容
        print("Len     :", len(line)," Type :", type(line),"   Rsponse : %s" % line)

        aa = line.hex()         # 字节变成字符串
        print("Len     :",len(aa),type(aa),aa)

        az = aa.split(" ")      # 字符串变成列表元素
        print("Len     :",len(az),type(az),az)



        print('\n')

        # try:
        #     # print("Rsponse : %s" % line)     # 字节
        # except:
        #     print('出现异常')

        #=======  选择接受次数  =========
        # maxloopNum = maxloopNum + 1
        # if (re.search(b'OK', line)):
        #     break
        # elif (maxloopNum > MAX_LOOP_NUM):
        #     sys.exit(0)
        # ============================

        Reveice_Value = aa

        Handle_Reveice()
        # result = Reveice_Value
        # return Reveice_Value


'''
# ======================================
# 等待回复  函数
# ======================================
'''

def Handle_Reveice():
    print('Handle_Reveice')

    print(Reveice_Value[:10],Reveice_Value[10:18],Reveice_Value[18:34],Reveice_Value[34:48],)

    # print(Reveice_Value[16:18])
    if Reveice_Value[17:18] == '2' :
        print('ID: %s'% Reveice_Value[10:18])

        AT = bytes(crc_value)
        sendAT_Cmd(ser, AT, 1)

# ========================================================




'''
  Frame head          |   Data   |  CRC
 Address  | function  |   Ntype  |  2Type

  - - - - - - - - - - - - - - - - - - - -  
  1.获取ID 设备地址,并保存
  2.确实发送的功能码
  3.读取寄存器地址和数量
  4.CRC校验

  - - - - - - - - - - - - - - - - - - - - 
  
1.获取设备地址
0xff, 0x03, 0x75, 0x52, 0x00, 0x01, 0xff, 0xff

'''



# ===============================================================


# ===============================================================

'''
#===============================================================
#   测试专用
#===============================================================
'''
if __name__ == '__main__':


    print('-------------------------------------')
    print('=\t\t 欢迎进入   测试环境  \t\t\t=')
    print('-------------------------------------\n')
    #
    # 语句
    # AT_CMD = [0x01, 0x04, 0x13, 0x7e, 0x00, 0x0A]
    # Input_AT_CMD(AT_CMD)
    #
    Modbus_CRC()

    Serial_info()


    sur.colse()

        
    # ===============================================================

 

__all__ = ["CalCRC16","CheckCRC"]

# ===============================================================
import crcmod



# ===============================================================
'''
# ======================================
# 校验函数  函数
# ======================================
'''
def CalCRC16(data, length):
    print(' 校验函数     CalCRC16')
    print('显示输入参数:',data,'\t', length)

    crc=0xFFFF      # 初始值 变量申明
    if length == 0:
        length = 1
    ## for j in data:
    ##     crc ^= j

    j = 0
    while length != 0:
        crc ^= list.__getitem__(data, j)
        #print('j=0x%02x, length=0x%02x, crc=0x%04x' %(j,length,crc))
        for i in range(0,8):
            if crc & 1:
                crc >>= 1
                crc ^= 0xA001
            else:
                crc >>= 1
        length -= 1
        j += 1
        ##if length == 0:
        ##         break

    return crc

# ===============================================================
def CheckCRC(data, length, crctype):
    print('校验CRC  CheckCRC')
    print('Length | Type | Data : ',length, type(data), data)

    if length < 3:
        print('The data len(%d) is less than 3!!!', length)
        return 0

    crc_res = 0
    tmp=[0,0,0,0]

    if crctype == 0:
        crc_res = CalCRC16(data, length-2)
        tmp[0] = crc_res & 0xFF
        tmp[1] = (crc_res >> 8) & 0xFF

        if data[length-2] == tmp[0] and data[length-1] == tmp[1]:
            return 1
    elif crctype == 1:
        print('CRC32 is not support...')

    return 0
# ===============================================================





# ===============================================================
'''
#===============================================================
#   测试专用
#===============================================================
'''
if __name__ == '__main__':

    ## Name Identifier-name, Poly  Reverse Init-value XOR-out Check
    ## ['modbus','CrcModbus',0x18005,REVERSE,0xFFFF,0x0000,0x4B37]
    ## crc16 = crcmod.mkCrcFun(0x18005, rev=True, initCrc=0xFFFF,  xorOut=0x0000) # rev=True,False

    crc16 = crcmod.mkCrcFun(0x18005,  initCrc=0xFFFF,rev=True,  xorOut=0x0000) # rev=True,False
    crc_array = b'0xFE 0xFD'
    crc_calc = crc16(crc_array) #计算得到的CRC
    a=hex(crc_calc)
    print(crc_calc,a)
    print('\n')

    # =========================================
    crc_value = [0x01, 0x04, 0x13, 0x87, 0x00, 0x30]
    crc_transformation = CalCRC16(crc_value,len(crc_value))
    crc_calculation    = hex(crc_transformation)
    # print('crc_calculation:',crc_calculation)
    tasd = [0x00,0x00]
    tasd[0]  = crc_transformation & 0xFF
    tasd[1] = (crc_transformation >> 8) & 0xFF
    H =hex(tasd[0])
    L =hex(tasd[1])
    H_value = int(H,16)
    L_value = int(L,16)
    crc_value.append(H_value)
    crc_value.append(L_value)
    print(crc_value)          # calculation value   CRC

    # ========================================================
    print('\n')
    # crc_value2 = [0x01, 0x04, 0x13, 0x87, 0x00, 0x30,0x44,0xB3]
    # print('crc_value2:',crc_value2)
    # crc_cheak=CheckCRC(crc_value2,len(crc_value2),0)

    crc_check=CheckCRC(crc_value,len(crc_value),0)
    if crc_check == 1:
        print('Right')
    else:
        print('wrong')

    print(crc_check)    # check calculation value

 

--

RUN Result

--

-------------------------------------
=		 欢迎进入   测试环境  			=
-------------------------------------

校验函数 Modbus CRC
 校验函数     CalCRC16
显示输入参数: [1, 4, 19, 126, 0, 10] 	 6
crc_transformation:  37140 <class 'int'>
crc_calculation   :  0x9114 <class 'str'>
crc_value         :  8 <class 'list'> [1, 4, 19, 126, 0, 10, 20, 145]


校验CRC  CheckCRC
Length | Type | Data :  8 <class 'list'> [1, 4, 19, 126, 0, 10, 20, 145]
 校验函数     CalCRC16
显示输入参数: [1, 4, 19, 126, 0, 10, 20, 145] 	 6
Result    : 1
CRC_Check : Right


串口初始化  Serial_info
默认请输入:1  
重新输入为:2
您的请选择:  1
发送指令函数  send_cmd
Command : b'\x01\x04\x13~\x00\n\x14\x91'
Port    : COM5
等待回复函数  waitForCmdOKRsp
Len     : 19  Type : <class 'bytes'>    Rsponse : b'\x00\x00\x00\x02\x02\x04\t\xc3\x00R\x82d\x00\x00\x00\x02\x02\x04\n'
Len     : 38 <class 'str'> 00000002020409c3005282640000000202040a
Len     : 1 <class 'list'> ['00000002020409c3005282640000000202040a']


Handle_Reveice
0000000202 0409c300 5282640000000202 040a
Len     : 24  Type : <class 'bytes'>    Rsponse : b'\x15\x00<\xe24\x00\x00\x00\x02\x02\x04\t\xc3\x00R\x82d\x00\x00\x00\x02\x02\x04\n'
Len     : 48 <class 'str'> 15003ce23400000002020409c3005282640000000202040a
Len     : 1 <class 'list'> ['15003ce23400000002020409c3005282640000000202040a']


Handle_Reveice
15003ce234 00000002 020409c300528264 0000000202040a
ID: 00000002
发送指令函数  send_cmd
Command : b'\x01\x04\x13~\x00\n\x14\x91'
Port    : COM5
等待回复函数  waitForCmdOKRsp
Len     : 24  Type : <class 'bytes'>    Rsponse : b'\x15\x00<\xe24\x00\x00\x00\x02\x02\x04\t\xc3\x00R\x82d\x00\x00\x00\x02\x02\x04\n'
Len     : 48 <class 'str'> 15003ce23400000002020409c3005282640000000202040a
Len     : 1 <class 'list'> ['15003ce23400000002020409c3005282640000000202040a']


Handle_Reveice
15003ce234 00000002 020409c300528264 0000000202040a
ID: 00000002
发送指令函数  send_cmd
Command : b'\x01\x04\x13~\x00\n\x14\x91'
Port    : COM5
等待回复函数  waitForCmdOKRsp
Len     : 24  Type : <class 'bytes'>    Rsponse : b'\x15\x00<\xe24\x00\x00\x00\x01\x01\x04\t\xc3\x00R\x82W\x00\x00\x00\x01\x01\x04\n'
Len     : 48 <class 'str'> 15003ce23400000001010409c3005282570000000101040a
Len     : 1 <class 'list'> ['15003ce23400000001010409c3005282570000000101040a']


Handle_Reveice
15003ce234 00000001 010409c300528257 0000000101040a
Len     : 24  Type : <class 'bytes'>    Rsponse : b'\x15\x00<\xe2\x07\x00\x00\x00\x01\x01\x04\t\xc3\x00R\x82W\x00\x00\x00\x01\x01\x04\n'
Len     : 48 <class 'str'> 15003ce20700000001010409c3005282570000000101040a
Len     : 1 <class 'list'> ['15003ce20700000001010409c3005282570000000101040a']


Handle_Reveice
15003ce207 00000001 010409c300528257 0000000101040a
Len     : 24  Type : <class 'bytes'>    Rsponse : b'\x15\x00<\xe2\x07\x00\x00\x00\x01\x01\x04\t\xc3\x00R\x82W\x00\x00\x00\x01\x01\x04\n'
Len     : 48 <class 'str'> 15003ce20700000001010409c3005282570000000101040a
Len     : 1 <class 'list'> ['15003ce20700000001010409c3005282570000000101040a']


Handle_Reveice
15003ce207 00000001 010409c300528257 0000000101040a
Len     : 24  Type : <class 'bytes'>    Rsponse : b'\x15\x00<\xe2\x07\x00\x00\x00\x02\x02\x04\t\xc3\x00R\x82d\x00\x00\x00\x02\x02\x04\n'
Len     : 48 <class 'str'> 15003ce20700000002020409c3005282640000000202040a
Len     : 1 <class 'list'> ['15003ce20700000002020409c3005282640000000202040a']


Handle_Reveice
15003ce207 00000002 020409c300528264 0000000202040a
ID: 00000002
发送指令函数  send_cmd
Command : b'\x01\x04\x13~\x00\n\x14\x91'
Port    : COM5
等待回复函数  waitForCmdOKRsp
Len     : 24  Type : <class 'bytes'>    Rsponse : b'\x15\x00<\xe24\x00\x00\x00\x02\x02\x04\t\xc3\x00R\x82d\x00\x00\x00\x02\x02\x04\n'
Len     : 48 <class 'str'> 15003ce23400000002020409c3005282640000000202040a
Len     : 1 <class 'list'> ['15003ce23400000002020409c3005282640000000202040a']


Handle_Reveice
15003ce234 00000002 020409c300528264 0000000202040a
ID: 00000002
发送指令函数  send_cmd
Command : b'\x01\x04\x13~\x00\n\x14\x91'
Port    : COM5
等待回复函数  waitForCmdOKRsp

Process finished with exit code -1

  

posted @ 2018-09-12 19:33  楚格  阅读(1074)  评论(0编辑  收藏  举报