本文利用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

我要赚赏金
