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 模å�—也是é�žå¸¸æœ‰ç”¨çš„。