Python 串口通讯操作实现

串口通讯

平常与设备通讯的方式都是串口通讯,常用的协议包括RS-232、RS-422和RS-485。

RS-232

RS-232只限于PC串口和设备间点对点的通信。RS-232串口通信最远距离是50英尺。
RS-232的接头是DB-9,但是通常使用最多3个针脚:TXD(2pin)、RXD(3pin)和 GND(5pin)。
注意如果设备只提供接线柱的话,记得TX与设备的RX连接,RX和设备的TX连接。

RS-422

RS-422使用差分信号,RS-232使用非平衡参考地的信号。差分传输使用两根线发送和接收信号,对比RS-232,它能更好的抗噪声和有更远的传输距离。在工业环境中更好的抗噪性和更远的传输距离是一个很大的优点。

RS-485

有多个设备有通讯能力,你可以使用一个单个RS-485口建立设备网络。
RS-485是RS-422的超集,因此所有的RS-422设备可以被RS-485控制。RS-485可以用超过4000英尺的线进行串行通行。
RS-485的DB-9接头定义一般也最多使用到3个引脚:T+(1pin)、T-(2pin)、GND(5pin)
RS-485的通讯由于可以多个设备连接,所以可以通过监听来获得上位机和设备的对话。

代码实现

需要 pyserial库支持。

每次发送数据的时候需要转成字节数组后再往COM口发送,否则会数据发送失败。
python 2.x 和 python 3.x的字节数组转换有些不一样
python 2.x 是 data = bytearray.fromhex(value.encode('hex'))
python 3.x 是 data = bytes().fromhex(value)
读取数据如果需要十六进制 则进行转换,如果是ascii 则可以直接 打印

以下代码是python2.x实现

import serial
import serial.tools.list_ports
import time

class myserial:

    COMM = None
    delay = 0.08

    def __init__(self):
        pass
        
    
    def list_ports(self,OS = 0):
        # OS is 0 mean os is windows,OS is 1 mean os is linux 
        # return now search comm port name
        list_p = list(serial.tools.list_ports.comports())
        if OS:
            list_ports_name = [str(i.name) for i in list_p]
        else:
            list_ports_name = [str(i.device) for i in list_p]
        return list_ports_name
    
    def open_serial(self,port=None, baudrate=9600, bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, 
                    timeout=None, xonxoff=False, rtscts=False, write_timeout=None,
                    dsrdtr=False, inter_byte_timeout=None, exclusive=None):
        # open serial
        self.COMM = serial.Serial(port,baudrate,bytesize,parity,stopbits,timeout,xonxoff,rtscts,write_timeout,dsrdtr,inter_byte_timeout,exclusive)
        return self.COMM 

    def write_ascii(self,value):
        # wtite cmd to serial
        write_data = bytearray.fromhex(value.encode('hex'))
        try:
            self.COMM.write(write_data)
            return True
        except BaseException as e:
            print(e)
            return False

    def read_ascii(self):
        # read data from serail
        try:
            data = self.COMM.read(self.COMM.in_waiting)
            return data
        except BaseException as e:
            print(e)
            return None

    def query_ascii(self,value):
        # query mechine
        write_data = bytearray.fromhex(value.encode('hex'))
        try:
            self.COMM.write(write_data)
            time.sleep(self.delay)
            data = self.COMM.read(self.COMM.in_waiting)
            return data
        except BaseException as e:
            print(e)
            return None

    def write_hex(self,value):
        # wtite cmd to serial
        write_data = value.decode('hex')
        try:
            self.COMM.write(write_data)
            return True
        except BaseException as e:
            print(e)
            return False

    def read_hex(self):
        # read data from serail
        try:
            data = self.COMM.read(self.COMM.in_waiting).encode('hex')
            return data
        except BaseException as e:
            print(e)
            return None

    def query_hex(self,value):
        # query mechine
        write_data = value.decode('hex')
        try:
            self.COMM.write(write_data)
            time.sleep(self.delay)
            data = self.COMM.read(self.COMM.in_waiting).encode('hex')
            return data
        except BaseException as e:
            print(e)
            return None
        

    def close(self):
        self.COMM.close()




if __name__ == "__main__":
    s = myserial()
    a = s.list_ports()
    print(a)
  • 4
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
串口通信是一种外设和计算机之间通过数据信号线、地线、控制线等进行传输数据的通讯方式,其使用的数据线较少,可以节约通信成本,但传输速度较低。在Python中,可以使用pyserial模块来访问串口设备,它提供了一个统一的接口,可用于多平台的串口通信操作。 要获取可用的串口列表,可以使用serial.tools.list_ports模块的comports()函数,该函数返回一个包含可用串口信息的列表。通过遍历该列表,可以依次打印出每个可用串口的信息。下面是一个简单的示例代码: ```python import serial import serial.tools.list_ports port_list = list(serial.tools.list_ports.comports()) if len(port_list) == 0: print('无可用串口') else: for i in range(0, len(port_list)): print(port_list[i]) ``` 要实现简单的串口通信,可以使用serial模块。下面是一个简单的示例代码,展示了如何打开串口、写入数据并关闭串口:[3] ```python import serial try: portx = "COM3" # 串口号 bps = 115200 # 波特率 timex = 5 # 超时设置 ser = serial.Serial(portx, bps, timeout=timex) # 打开串口 result = ser.write("我是东小东".encode("gbk")) # 写入数据 print("写总字节数:", result) ser.close() # 关闭串口 except Exception as e: print("---异常---:", e) ``` 以上是关于串口通信的Python代码示例,可以根据实际需求进行相应的修改和扩展。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Python的串口通信(pyserial)](https://blog.csdn.net/m0_59485658/article/details/128555108)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值