一直很想了解设备驱动编程。所以就从最基础,最简单的设备开始了解。串口,应该是所有设备中最简单最常见的设备。在linux中,有一种最简单的串口设备在/dev
下表现的是字符设备(c),字符设备可以被打开并且读写。
我认识的第一个最简单的串口设备是一个usb接口的gps模块,如下图 它是我目前为止,用过的最简单的串口设备,它只需要读,无需写,单向通讯,我只需要打开字符设备,然后不停的从中读取数据就可以了,里面的数据是GPS定位信息相关的字符串,根据它的文档,进行字段解析,就能获取到经纬度、时间、角度、速度等信息。我曾经用golang写过一个一个程序获取这些信息 这个程序,实际上可以算是一个用户态的设备驱动程序。
我认识的第二个串口设备是一套蓝牙模块,用了usb转串口线连接蓝牙模块
按照设备的文档,我将它通过usb转串口线连接,然后将usb插上电脑,成功识别到串口。然后手机通过客服提供的调试app连接蓝牙信号,电脑上用串口读写软件将串口打开,手机上发送信息,电脑串口上能收到信息,电脑串口上还能发送特定的AT指令对设备进行查询与设置。
值得注意的是,我在连接模块的过程中,将usb转串口上的tx连接了模块tx,rx连接了模块的rx,导致无法收发消息,客服帮我找出问题并告诉我应该将tx连接rx,rx连接tx。想到这一点我恍然大悟,这跟rust里的channel
,go里的chan
,以及linux上的通用管道一样,都属于管道模型,对端的输出接入到设备的输入,对端才能将信息传给设备。后续我想我会进一步对这个蓝牙模块编写用户态驱动程序,进而尝试编写内核态驱动程序。
其实早在我认识GPS串口设备之前,我也试过温湿度传感器DHT22,但是,这玩意儿根本不是串口,它只有一个数据接口(DATA),也就是不像串口那样分rx,tx,它需要通过gpio口连接DATA针,然后通过高电位低电位来实现双向通讯,从而获取到温湿度数据。它既然不是串口设备那么也不能作为通用设备直插一般的电脑了。
在我看来,程序能驱动物理设备,也是一件很有趣的事情。