在Linux下,串口的读写跟文件的读写无异,我们只需对相应的设备文件操作,即可实现对串口的通讯,这里给出的是一个实例,具体概念的东西可能不会详细解释,可自行百度,简单来说串口通讯就是双方按照一定的数据格式发送接收数据,一般是主从模式,即主机发请求数据,从机收到后返回对应的数据。
串口通讯的应用场景非常广泛,常见的温湿度采集、自动门的控制等等。因为需要对这些简单的装置信息采集或控制,从而构建出一个综合的系统,这里串口通讯必不可少,方便、廉价。
下面就以温湿度采集作为实例写一篇博文。
我手上的这款温湿度是上海拓福电气SZ-WS系列温湿度变送器,如下图:(大家不用细究报文格式含义,弄懂通讯原理即可举一反三)
其中说明书主要是说了通讯规约,即报文的格式:如下
/************************************************************************************************
* 传感器->主站RS485帧结构
* _________________________________________________________________________
* | DestAddr 1Byte | MSG_TYPE 1Byte| DataLen 1Byte | Data <= 255Byte | CRC 2Byte |
* |________________|________________|________________|______________|______________
*
* 主站->传感器 RS485帧结构
* __________________________________________________________________________
* | DestAddr 1Byte | MSG_TYPE 1Byte|star add 2Byte |Register Num 2Byte | CRC 2Byte
* |_______________|_______________|_______________|____________________|___________|
*
*****************************************************************************/
程序的流程大概如下,没有消息发送和无数据接收时都是睡眠状态,释放CPU。
部分代码解析如下:
main函数主要是创建温湿度类,然后0.5秒获取一次值,将其打印出来。
其中串口的参数要根据具体的设备来,tty设备就是对应的串口文件,具体怎么找出使用的串口是哪个tty这里就不详解了,可自行百度。
点击(此处)折叠或打开
- int main()
- {
- SERIAL_S stSerialParam;
- stSerialParam.u8BaudRate = BR_9600;
- stSerialParam.u8DataBit = 0; // 8bit
- stSerialParam.u8StopBit = 0; // 1bit
- stSerialParam.u8Check = 0; // None
- CHumitureManager *m_pCHumiture = new CHumitureManager(“/dev/ttyS2”, &stSerialParam, 1);
- while(1)
- {
- printf(“