.net使用IronPython执行脚本进行串口通信

<span style="font-family:Microsoft YaHei;">不懂怎么写博客:</span>
<span style="font-family:Microsoft YaHei;"><img src="https://img-blog.csdn.net/20140829112750138?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGxpbWl0ZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />
</span>
<span style="font-family:Microsoft YaHei;">Imports System.IO.Ports
Imports IronPython.Hosting
Imports Microsoft.Scripting.Hosting
Imports Microsoft.Scripting.Runtime
Imports System.Threading
Module Test
    Sub Main()
        Dim obj As Object
        Dim sciptrt As ScriptRuntime = Python.CreateRuntime()
        obj = sciptrt.UseFile("testpy.py")
        REM 本来是想传递串口类给Python的,但是对象不能通用。
        REM Dim sp As New SerialPort("COM3", 9600)
        REM sp.Open()
        REM 创建Python串口对象
        Dim pysp As Object
        REM 初始化Python串口,这个要看Python脚本怎么写了
        pysp = obj.initCOM(1)
        REM 串口返回的数据,跟Byte数组也不一样
        REM Imports Microsoft.Scripting.Runtime
        Dim receive As IronPython.Runtime.Bytes
        Dim r() As Byte
        Dim tmpstr As String
        For i = 0 To 255
            REM Python串口发送,返回到receive中,这个也要看Python脚本怎么写
            receive = obj.send01(pysp, i)
            REM 类型转换
            r = receive.ToArray()
            REM 格式化输出
            For n = 0 To r.Length - 1
                tmpstr += r(n).ToString("X2") + " "
            Next
            Console.WriteLine("receive:" + tmpstr)
            tmpstr = ""
            Thread.Sleep(1000)
        Next
        Console.ReadKey()
    End Sub
End Module</span>

python script("testpy.py"):

<span style="font-family:Microsoft YaHei;">#THIS PYTHON SCRIPT IS CONTROL HSC8D8D IO CARD
import serial
import string
import time
clock01check= [0xAA ,0xF9, 0x01, 0xFE, 0x01, 0xFE, 0x00, 0xAB]

hs01check=[0x01 ,0x02 ,0x00 ,0x00 ,0x00 ,0x08 ,0x79 ,0xCC]
hs02check=[0x02 ,0x02 ,0x00 ,0x00 ,0x00 ,0x08 ,0x79 ,0xFF]
hs03check=[0x03 ,0x02 ,0x00 ,0x00 ,0x00 ,0x08 ,0x78 ,0x2E]
################################################
def crc16(data):
    ret=[]
    lo=0xff
    hi=0xff
    cl=0x01
    ch=0xa0
    #print ("data size:%d"%len(data))
    for i in data:
      ret.append(i)
      #print("  LO:%d"%lo)
      lo=lo ^ int(i)
      #print("  LO:%d"%lo)
      for flag in range(0,8):
          savehi=hi
          savelo=lo
          hi=hi>>1
          lo=lo>>1
          if((savehi & 0x01)==0x01):
              lo=lo | 0x80
          if((savelo & 0x01)==0x01):
              hi=hi ^ ch
              lo=lo ^ cl
              #print("%d-%d"%(hi,lo))
    else:
        ret.append(lo)
        ret.append(hi)
    return ret
def printonX(data):
    print "write:"+" ".join(["0x%02x" %ord(chr(x)) for x in crc16(data)])
    return "write:"+" ".join(["0x%02x" %ord(chr(x)) for x in crc16(data)])
################################################
def check01(sp):
    sp.write(hs01check)
    return sp.read(6)
def check02(sp):
    sp.write(hs02check)
    return sp.read(6)
def check03(sp):
    sp.write(hs03check)
    return sp.read(6)
def initCOM(nCode):
    return serial.Serial(nCode)
def setBaduRate(sp,baudrate):
    sp.serBaudrate(baudrate)
def setTimeOut(sp,t):
    sp.timeout=t
def close(sp):
    sp.close()
################################################
def send01(sp,c):
    data=[0x01,0x0F,0x00,0x00,0x00,0x08,0x01]
    data.append(c)
    if(sp.isOpen):
        print sp.portstr +"State: IsOpen"
    try:
        sp.write(bytes(crc16(data)))
    except Exception,e:
        print e
    finally:
        print "write:"+" ".join(["0x%02x" %ord(chr(x)) for x in crc16(data)])
    return sp.read(8)
################################################
def send02(sp,c):
    data=[0x02,0x0F,0x00,0x00,0x00,0x08,0x01]
    data.append(c)
    if(sp.isOpen):
        print sp.portstr +"State: IsOpen"
    try:
        sp.write(bytes(crc16(data)))
    except Exception,e:
        print e
    finally:
        print "write:"+" ".join(["0x%02x" %ord(chr(x)) for x in data])
    return sp.read(8)
################################################
def send03(sp,c):
    data=[0x03,0x0F,0x00,0x00,0x00,0x08,0x01]
    data.append(c)
    if(sp.isOpen):
        print sp.portstr +"State: IsOpen"
    try:
        sp.write(bytes(crc16(data)))
    except Exception,e:
        print e
    finally:
        print "write:"+" ".join(["0x%02x" %ord(chr(x)) for x in data])
    return sp.read(8)
################################################
</span>

把testpy.py生成在文件夹中。并添加python的第三方库.pyserial。目前好像只支持2.7。所用的IronPython版本2.7.4。

资源下载:http://download.csdn.net/detail/llimite/7837853



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值