5.20 与串行端�的数�通信¶

问题¶

你想通过串行端�读写数�,典型场景就是和一些硬件设备打交�(比如一个机器人或传感器)。

解决方案¶

尽管你�以通过使用Python内置的I/O模��完�这个任务,但对于串行通信最好的选择是使用 pySerial包 。 这个包的使用�常简�,先安装pySerial,使用类似下�这样的代�就能很容易的打开一个串行端�:

import serial
ser = serial.Serial('/dev/tty.usbmodem641', # Device name varies
                    baudrate=9600,
                    bytesize=8,
                    parity='N',
                    stopbits=1)

设备�对于��的设备和�作系统是�一样的。 比如,在Windows系统上,你�以使用0, 1等表示的一个设备�打开通信端��COM0�和�COM1�。 一旦端�打开,那就�以使用 read(),readline() 和 write() 函数读写数�了。例如:

ser.write(b'G1 X50 Y50\r\n')
resp = ser.readline()

大多数情况下,简�的串�通信从此�得�分简�。

讨论¶

尽管表�上看起�很简�,其实串�通信有时候也是挺麻烦的。 推�你使用第三方包如 pySerial 的一个原因是它�供了对高级特性的支� (比如超时,控制�,缓冲区刷新,�手�议等等)。举个例�,如果你想�用 RTS-CTS �手�议, 你�需�给 Serial() 传递一个 rtscts=True 的�数��。 其官方文档�常完善,因此我在这里�力推�这个包。

时刻记�所有涉�到串�的I/O都是二进制模�的。因此,确�你的代�使用的是字节而�是文本 (或有时候执行文本的编�/解��作)。 �外当你需�创建二进制编�的指令或数�包的时候,struct 模�也是�常有用的。