最近一直在做关于气浮台的项目,里面有一个小环节就是需要把设备的数据传输下来,因为之前对通信几乎是小白,加上时间比较紧,凡是涉及到底层的东西都不敢碰,最后比较了一番选了ESP 8266这个模块来开发,通过AT指令进行开发,用的是C语言,运行在PC 104上(当然普通PC更没问题了),大概五天时间就做完了,下面介绍一下详细内容。
(一)ESP 8266模块介绍
这个模块的详细资料网上很容易找到,在此就不详述了,简单说几点吧。
这个模块开发有两种方式:第一种是用官方SDK来开发,适合对硬件有一定了解的朋友入手,因为这个模块本身的功能其实很强大,只用来通讯有点小题大做的感觉,但是这种方式不适合新手,入手难度有点高;第二种就是AT指令开发,很简单,拿一般的串口助手就可以调试。(注意调试的时候一定要先按回车再发送)
这个模块总共有三种工作方式:AP,STATION,AP+STATION。因为我需要完成的是多个设备数据传输,因此透传就不考虑了,这里我用的是一个模块用作热点同时开启服务器(用AP+STATION),通过串口接在终端上收数据;其他的模块通过串口接在设备上(用STATION)。相当于组建了一个小的局域网,基于TCP协议的WiFi通信。
这里再单独提一下,用AT指令开发有一个很头疼的地方在于指令的返回格式不统一,所以程序里面的判断条件会比较多。后面我会仔细的总结一下,其他的信息大家可以去找用户手册,里面对模块的介绍以及AT指令都比较完整。
(二)用C语言实现WIN 32下的串口通讯
这一步说白了就是怎么用C语言去完成串口助手最基本的功能,但是也必须要仔细,很多地方容易出错。
1. 首先打开串口,Createfile函数的具体用法在此不详述了,不熟悉的朋友可以去百度。
espCom = CreateFile("COM3", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
if (espCom == INVALID_HANDLE_VALUE)
{
printf("open COM3 failed\n");
exit(2);
}
提醒一下大家,如果设备的串口不是COM1-COM9,比如是COM10,那么函数第一个不能写成“COM10”了,得写成“\\\\.\\COM10”,因为COM10以上的串口对于文件名系统而言只是一般的文件,而非串行设备。
2. 完成串口相应的配置工作
espTimeOuts.ReadIntervalTimeout = 500;//MAXDWORD; //5000;
espTimeOuts.ReadTotalTimeoutConstant = 5000; //0;//1000;
espTimeOuts.ReadTotalTimeoutMultiplier = 500;// 0;//500;
espTimeOuts.WriteTotalTimeoutConstant = 2000;
espTimeOuts.WriteTotalTimeoutMultiplier = 500;
if (!SetCommTimeouts(espCom, &espTimeOuts))
{
printf("写入超时参数错误\n");
exit(3);
}
if (!SetupComm(espCom, 1024, 1024))
{
printf("设置串口读写缓冲区失败\n");
exit(4);
}
if (!GetCommState(espCom, &espdcb))
{
printf("获取串口属性失败\n");
exit(5);
}
espdcb.BaudRate = BAUD_RATE;
espdcb.ByteSize = 8;
espdcb.Parity = NOPARITY;
espdcb.StopBits = ONESTOPBI