一、准备
- 一块块装好AT固件的8266芯片
- 一台装了linux的嵌入式开发板
- 将芯片与开发板进行连接
二、AT+CWLAP——扫描当前可用的 AP
通过发送AT+CWLAP
,可捕获周围的AP信息,下面是查看官方AT文档后得到的信息:
在超级终端中尝试,其中新刷入的固件要启动WIFI模式,启动指令:AT+CWMODE_DEF=3
三、在主程序中实现UART通信
由于我用的是改造过的固件,波特率和官方的不一样,所以在使用的时候请改一下波特率,在代码的宏定义部分。
int main(int argc, char *argv[])
{
int fd, res;
struct termios oldtio, newtio;
char ch;
char buf[256] = {
0};
printf("Start...\n");
//-----------打开uart设备文件------------------
fd = open(UART_DEVICE, O_RDWR|O_NOCTTY);//没有设置O_NONBLOCK,所以这里read和write是阻塞操作
if (fd < 0) {
perror(UART_DEVICE);
exit(1);
}
else
printf("Open %s successfully\n", UART_DEVICE);
//-----------设置操作参数-----------------------
tcgetattr(fd, &oldtio);//获取当前操作模式参数
memset(&newtio, 0, sizeof(newtio));
//波特率 数据位=8 使能数据接收
newtio.c_cflag = BAUDRATE|CS8|CLOCAL|CREAD;
newtio.c_iflag = IGNPAR;
//newtio.c_oflag = OPOST | OLCUC; //
/* 设定为正规模式 */
//newtio.c_lflag = ICANON;
tcflush(fd, TCIFLUSH);//清空输入缓冲区和输出缓冲区
tcsetattr(fd, TCSANOW, &newtio);//设置新的操作参数
//------------向urat发送数据-------------------
char writeBuf[32] = "AT+CWLAP\r\n";
res = write(fd, writeBuf, 32);
printf("Writing: %s\n", writeBuf);
//-------------从uart接收数据-------------------
string allReturnBuf = "";
string s_buf;
printf("Reading...\n");
while(1) {
res = read(fd, buf, 64);//程序将在这里挂起,直到从uart接收到数据(阻塞操作)
if (res == 0)
continue;
buf[res] = '\0';
// printf("res = %d, buf = %s\n", res, buf);//将uart接收到的字符打印出来
// 由于每次最多只能拿32位数据,所以要一直获取直到指令返回信息全部取回
s_buf = buf;
allReturnBuf += s_buf;
// 判断AT返回命令是否到头
if (isEnd(allReturnBuf)) {
// for (int i = 0; i < allReturnBuf.size(); i++) {
// if ('\n' == allReturnBuf[i]) cout << "\\n";
// else if ('\0' == allReturnBuf[i]) cout << "\\0";
// else if ('\r' == allReturnBuf[i]) cout << "\\r";
// else cout << allReturnBuf[i];
// }
cout << "response:\n" << allReturnBuf;
cout << endl;
displayRes(selectWifiInfo(allReturnBuf));
break;
}
}
//------------关闭uart设备文件,恢复原先参数--------