本文利用WS8204出厂AT固件实现数据透传,达到控制目标MCU的目的。
一、总体框图
使用2个WS8204,一个做为主机连接PC机,另一个做为从机并连接目标MCU。
1、PC机通过UART发送AT指令到WS8204主机,WS8204主机通过SLE发送给WS8204从机;
2、WS8204从机收到指令进行处理,并通过UART发送给目标单片机AT32L021处理。MCU对于透传数据进行解析,并判断是否自定义命令,按照命令点灯或改变LCD背景颜色。
二、用到的几个AT指令
1、AT+HELP\r\n
显示帮助内容,列出所有AT指令
AT+ECHO | -- | GET| SET| -- | The command echo enables or disable. AT+GMR | -- | GET| -- |HELP| Get Device Information AT+HELP | DO| -- | SET| -- | Gets the list of AT AT+RESTORE | DO| -- | -- | -- | Restore factory Settings and restart AT+RST | DO| -- | -- | -- | Restart module AT+SLEEP | DO| -- | -- | -- | Into sleep. AT+UART | -- | GET| SET|HELP| Gets or sets UART parameters AT+SANNOU | -- | GET| SET|HELP| Set or Get Sle announce Enable. AT+SANNOUPARA | -- | GET| SET|HELP| Set or Get Sle announce intv. AT+SCONPARA | -- | GET| SET|HELP| Set or Get Sle Connect parameters. AT+SDISC | DO| -- | SET| -- | Disconnect Sle AT+SFMAC | -- | GET| SET|HELP| Set or Get SLE SCAN Rssi Filter. AT+SFNAME | -- | GET| SET|HELP| Set or Get Sle scan name filter. AT+SFRSSI | -- | GET| SET|HELP| Set or Get Sle scan rssi filter. AT+SMAC | -- | GET| -- | -- | Set or Get Sle MAC. AT+SMCONPARA | -- | -- | SET|HELP| Sets the connection parameter for the specified link. AT+SMTU | -- | GET| SET|HELP| Set or Get Sle MTU. AT+SMUX | -- | GET| SET|HELP| Set or Get Sle Maximum number of connections. AT+SNAME | -- | GET| SET|HELP| Set or Get Sle Name. AT+SPMAC | -- | GET| SET|HELP| Set or Get Peer MAC. AT+SRFPWR | -- | GET| SET|HELP| Set or Get Sle Maximum number of connections. AT+SROLE | -- | GET| SET|HELP| Set or Get Sle role. AT+SSCAN | -- | GET| SET|HELP| Set or Get Sle Scan. AT+SSCANPARA | -- | GET| SET|HELP| Set or Get Sle Scan parameters. AT+SSEND | DO| -- | SET| -- | into Data transmit +OK
2、AT+SROLE?\r\n
查询 SLE 角色
+SROLE=1
这里2个WS8204,一主一从需要提前设好。
设置为主机:AT+SROLE=1
设置为从机:AT+SROLE=0
设置完成后,2个WS8204会自动连接
3、AT+SDISC\r\n
手动断开 SLE 连接
+SDISCONN:0,17 +SCONN:0,"24:db:bd:8c:76:dc"
可以看到,当执行此命令后,模块会自动重新连接,并显示对端MAC。
4、AT+SSEND透传
例如:
AT+SSEND=0,5\r\nCMD01
会透传5个字符:CMD01
+OK >+SSEND:5
三、从机目标MCU处理
AT指令需要在PC机上通过串口工具进行发送,而从机目标MCU需要涉及UART的接收处理
1、UART接收中断
void USART4_3_IRQHandler(void) { char c; char *comma_pos; uint8_t buff[10]; if(usart_flag_get(USART4, USART_RDBF_FLAG) != RESET) { usart_flag_clear(USART4,USART_RDBF_FLAG); c=usart_data_receive(USART4); usart4_rx_buffer[usart4_rx_counter++] = c; //穿透 if(sle_trans_num>0&&(sle_trans_num==usart4_rx_counter)) { sle_trans_complete_flag=TRUE; } else if((usart4_rx_buffer[usart4_rx_counter-2]=='\r')&&(usart4_rx_buffer[usart4_rx_counter-1]=='\n')){ uart4_receive_complete_flag=TRUE; //判断是否接收到透传指令 if(strstr((char*)usart4_rx_buffer,"+SRD")){ comma_pos = strrchr(usart4_rx_buffer, ','); if (comma_pos != NULL) { // 将逗号后面的部分转换为整数 sle_trans_num= atoi(comma_pos + 1); memset(usart4_rx_buffer,0,64); usart4_rx_counter=0; } } } } }
主要处理2类接收数据:
一是AT指令,可以通过判断接收缓存中最后两个字节是否为\r\n确认,如果设置指令传输完成标志:uart4_receive_complete_flag=TRUE;
二是透传数据,对于指令中含有+SRD信息的,可以确定下一条指令为透传数据。并且可以确定透传数据长度。对于透传类数据接收到达透传数据长度的,设置透传完成标志:sle_trans_complete_flag=TRUE;
2、主循环处理
if(uart4_receive_complete_flag==TRUE){ uart4_receive_complete_flag=FALSE; lcd_log((uint8_t*)usart4_rx_buffer); usart4_rx_counter=0; memset(usart4_rx_buffer,0,64); } if(sle_trans_complete_flag){ sle_trans_num=0; sle_trans_complete_flag=FALSE; cmd_handler(); }
对于AT指令,只显示命令;对于透传数据转到cmd_handler()处理。
3、cmd_handler()
void cmd_handler(void) { at32_led_toggle(LED3); if(usart4_rx_buffer[3]=='0'&&usart4_rx_buffer[4]=='1') { at32_led_toggle(LED2); clrScr(VGA_BLUE); }else if(usart4_rx_buffer[3]=='0'&&usart4_rx_buffer[4]=='2') { at32_led_toggle(LED4); clrScr(VGA_GREEN); } lcd_log((uint8_t*)usart4_rx_buffer); }
如果是CMD01:翻转LED2,改变LCD背景色为蓝色
如果是CMD02:翻转LED4,改变LCD背景色为绿色
四、运行效果
https://www.bilibili.com/video/BV1D49EY1EVX/?t=66.6