51单片机:STC89C52RC
查询手册以及通过安信可的串口调试可以得到如下示例
连接服务器demo
#include "reg52.h"
#include "intrins.h"
#include "string.h"
sbit led1 = P3^7;
char buf[20]={0};
char mode[] = "AT+CWMODE=3\r\n";
code char lj_net[] = "AT+CWJAP=\"xiaomi_424\",\"424666233\"\r\n";
code char lj_service[] = "AT+CIPSTART=\"TCP\",\"192.168.31.6\",8080\r\n";
char open[]="AT+CIPMODE=1\r\n";
char send[]="AT+CIPSEND\r\n";
char reset[] = "AT+RST\r\n";
char flag=0;
char led_flag=0;
char e_flag=0;
char s_flag=0;
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void uart_init()
{
//设置SMOD=1
PCON = 0x10;
//设置串行通信方式1
SCON=0x50;
//设置定时器/计数器1定时、工作方式2
TMOD &=0x0F;
TMOD |= 0x20;
//设定定时常数
TL1=0xFD;
TH1=0xFD;
TR1=1;
ES=1;
}
void sendChar(char c)
{
SBUF=c;
while(!TI);
TI=0;
}
void sendString(char* str)
{
while(*str){
sendChar(*str);
str++;
}
}
void connect_wifi()
{
sendString(mode);
while(!flag);
flag=0;
sendString(lj_net);
while(!flag);
flag=0;
sendString(lj_service);
while(!flag);
flag=0;
sendString(open);
while(!flag);
flag=0;
sendString(send);
while(!flag);
flag=0;
s_flag=1;
}
void main()
{
EA=1;
uart_init();
Delay1000ms();
while(1){
if(s_flag==0){
connect_wifi();
}
sendString("connect success\r\n");
Delay1000ms();
if(led_flag){
led1=!led1;
}
led_flag=0;
e_flag=0;
}
}
void UART_Routine(void) interrupt 4
{
char tmp;
static char len=0;
if(RI){
tmp = SBUF;
if(tmp=='O' || tmp == 'L' || tmp=='E' || len>19){
len=0;
}
buf[len++] = tmp;
if(buf[0] == 'O' && buf[1]=='K'){
flag=1;
memset(buf,'\0',20);
}
if(buf[0] == 'L' && buf[1] == '1'){
led_flag=1;
memset(buf,'\0',20);
}
if(buf[0]=='E' && buf[1] == 'R'){
sendString(reset);
s_flag=0;
memset(buf,'\0',20);
}
RI=0;
}
}
esp作为服务器
上电之后,需要按一下复位键,否则可能上电后的invalid会干扰AT+RST的invalid。也可以不复位,那么就需要在uart之后延时一段时间,等待esp初始化完毕
#include "reg52.h"
#include "intrins.h"
#include "string.h"
sbit led1 = P3^7;
char buf[20]={0};
char mode[] = "AT+CWMODE=2\r\n";
char dlj[] = "AT+CIPMUX=1\r\n";
char TCP_Server[] = "AT+CIPSERVER=1\r\n";
/*
这里一定要注意,因为我发送的是hello,所以一定是0,5,如果是0,6那么会错误*/
char send[] = "AT+CIPSEND=0,5\r\n";
char reset[] = "AT+RST\r\n";
char ok_flag=0;
char con_flag=0;
char i_flag=0;
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void uart_init()
{
//设置SMOD=1
PCON = 0x10;
//设置串行通信方式1
SCON=0x50;
//设置定时器/计数器1定时、工作方式2
TMOD &=0x0F;
TMOD |= 0x20;
//设定定时常数
TL1=0xFD;
TH1=0xFD;
TR1=1;
ES=1;
}
void sendChar(char c)
{
SBUF=c;
while(!TI);
TI=0;
}
void sendString(char* str)
{
while(*str){
sendChar(*str);
str++;
}
}
void connect_wifi()
{
sendString(reset);
while(!i_flag);
i_flag=0;
ok_flag=0;
sendString(mode);
while(!ok_flag);
ok_flag=0;
sendString(dlj);
while(!ok_flag);
ok_flag=0;
sendString(TCP_Server);
while(!ok_flag);
ok_flag=0;
while(!con_flag);
con_flag=0;
}
void main()
{
EA=1;
uart_init();
Delay1000ms();
//配置成服务器
connect_wifi();
while(1){
//发送数据
sendString(send);
Delay1000ms();
Delay1000ms();
Delay1000ms();
sendString("hello");
Delay1000ms();
Delay1000ms();
Delay1000ms();
}
}
void UART_Routine(void) interrupt 4
{
char tmp;
static char len=0;
if(RI){
tmp = SBUF;
if(tmp=='O' || ','==tmp ||'i'==tmp || len>19){
len=0;
}
buf[len++] = tmp;
if(buf[0] == 'O' && buf[1]=='K'){
ok_flag=1;
memset(buf,'\0',20);
}
if(buf[0]==',' && buf[1]=='C')
{
con_flag=1;
memset(buf,'\0',20);
}
if(buf[0] == 'i' && buf[1]=='n'&&buf[2] == 'v'){
i_flag=1;
memset(buf,'\0',20);
}
RI=0;
}
}
stm32:stm32f103c8t6
连接服务器demo
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "string.h"
#include "stdio.h"
/* USER CODE END Includes */
/* USER CODE BEGIN PV */
uint16_t UART1_RX_STA;
uint8_t re_buf;
uint8_t buf[1024];
char buf_wifi[20];
char mode[] = "AT+CWMODE=3\r\n";
char lj_net[] = "AT+CWJAP=\"xiaomi_424\",\"424666233\"\r\n";
char lj_service[] = "AT+CIPSTART=\"TCP\",\"192.168.31.112\",8880\r\n";
char open[]="AT+CIPMODE=1\r\n";
char send[]="AT+CIPSEND\r\n";
char reset[] = "AT+RST\r\n";
char AT_OK=0;
char AT_Connect_Net_Flag=0;
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1){
//判断标志位最高位是否为1
if((UART1_RX_STA&0x8000) == 0){
//判断标志位第二位是否为1
if(UART1_RX_STA & 0x4000){
//判断是否接收完毕,也就是\n
if(re_buf==0x0a){
UART1_RX_STA |= 0x8000;
if(!strcmp(buf,"OK")){
AT_OK=1;
}
if(!strcmp(buf,"led")){
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
}
if(!strcmp((uint8_t *)buf, "FAIL"))
{
int i = 0;
for(i = 0; i < 5; i++)
{
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_8);
HAL_Delay(1000);
}
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET);
printf(reset);
}
memset(buf, 0, strlen(buf));
UART1_RX_STA = 0;
}else {
UART1_RX_STA=0;
}
}else {
//判断是否接收到了尾部,也就是\r
if(re_buf == 0x0d){
UART1_RX_STA |= 0x4000;
}else {
//0x3fff=0011 xxxx xxxx xxxx:就是能接收到数据的最多的个数
//&0x3fff就是防止数据溢出
buf[UART1_RX_STA&0x3FFF]=re_buf;
UART1_RX_STA++;
if(UART1_RX_STA>99){
UART1_RX_STA=0;
}
}
}
}
//中断接收完毕后,会自动关闭中断,所以这里需要重新打开
HAL_UART_Receive_IT(&huart1,&re_buf,1);
}
}
void connect_wifi()
{
printf(mode);
HAL_UART_Transmit(&huart2,mode,strlen(mode),100);
while(!AT_OK) HAL_Delay(50);
AT_Connect_Net_Flag=0;
AT_OK=0;
printf(lj_net);
HAL_UART_Transmit(&huart2,lj_net,strlen(lj_net),100);
while(!AT_OK) HAL_Delay(50);
AT_OK=0;
printf(lj_service);
HAL_UART_Transmit(&huart2,lj_service,strlen(lj_service),100);
while(!AT_OK) HAL_Delay(50);
AT_OK=0;
printf(open);
HAL_UART_Transmit(&huart2,open,strlen(open),100);
while(!AT_OK) HAL_Delay(50);
AT_OK=0;
printf(send);
HAL_UART_Transmit(&huart2,send,strlen(send),100);
while(!AT_OK) HAL_Delay(50);
AT_OK=0;
}
int fputc(int ch,FILE* f)
{
uint8_t tmp[1] = {ch};
HAL_UART_Transmit(&huart1,tmp,1,0xff);
return ch;
}
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
//.....
/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart1,&re_buf,1);
HAL_UART_Transmit(&huart2,"les't go\r\n",strlen("les't go\r\n"),100);
connect_wifi();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
printf("hello\r\n");
HAL_Delay(1000);
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
esp作为服务器
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : main.c
* @brief : Main program body
******************************************************************************
* @attention
*
* Copyright (c) 2023 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "usart.h"
#include "gpio.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "string.h"
#include "stdio.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
uint16_t UART1_RX_STA;
uint8_t re_buf;
uint8_t buf[1024];
char buf_wifi[20];
char mode[] = "AT+CWMODE=2\r\n";
char dlj[] = "AT+CIPMUX=1\r\n";
char TCP_Server[] = "AT+CIPSERVER=1\r\n";
char send[] = "AT+CIPSEND=0,7\r\n";
char reset[] = "AT+RST\r\n";
char AT_OK=0;
char AT_Connect_Net_Flag=0;
char send_ok = 0;
char i_flag=0;
void connect_wifi();
/* USER CODE END PV */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1){
//判断标志位最高位是否为1
if((UART1_RX_STA&0x8000) == 0){
//判断标志位第二位是否为1
if(UART1_RX_STA & 0x4000){
//判断是否接收完毕,也就是\n
if(re_buf==0x0a){
UART1_RX_STA |= 0x8000;
if(strstr(buf,",CON") != NULL){
AT_Connect_Net_Flag=1;
}
if(!strcmp(buf,"OK")){
AT_OK=1;
}
if(strstr(buf,"alid") != NULL){
i_flag=1;
}
if(strstr(buf,"led") != NULL){
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
}
if(strstr(buf,"SEND OK") != NULL){
send_ok=1;
}
memset(buf, 0, 1024);
UART1_RX_STA = 0;
}else {
UART1_RX_STA=0;
}
}else {
//判断是否接收到了尾部,也就是\r
if(re_buf == 0x0d){
UART1_RX_STA |= 0x4000;
}else {
//0x3fff=0011 xxxx xxxx xxxx:就是能接收到数据的最多的个数
//&0x3fff就是防止数据溢出
buf[UART1_RX_STA&0x3FFF]=re_buf;
UART1_RX_STA++;
if(UART1_RX_STA>99){
UART1_RX_STA=0;
}
}
}
}
//中断接收完毕后,会自动关闭中断,所以这里需要重新打开
HAL_UART_Receive_IT(&huart1,&re_buf,1);
}
}
void connect_wifi()
{
i_flag=0;
printf(reset);
HAL_UART_Transmit(&huart2,reset,strlen(reset),100);
while(!i_flag) HAL_Delay(50);
i_flag=0;
AT_OK=0;
printf(mode);
HAL_UART_Transmit(&huart2,mode,strlen(mode),100);
while(!AT_OK) HAL_Delay(50);
AT_OK=0;
printf(dlj);
HAL_UART_Transmit(&huart2,dlj,strlen(dlj),100);
while(!AT_OK) HAL_Delay(50);
AT_OK=0;
printf(TCP_Server);
HAL_UART_Transmit(&huart2,TCP_Server,strlen(TCP_Server),100);
while(!AT_OK) HAL_Delay(50);
AT_OK=0;
HAL_UART_Transmit(&huart2,"go ATCONNEct\r\n",strlen("go ATCONNEct\r\n"),100);
while(!AT_Connect_Net_Flag) HAL_Delay(50);
AT_Connect_Net_Flag=0;
}
int fputc(int ch,FILE* f)
{
uint8_t tmp[1] = {ch};
HAL_UART_Transmit(&huart1,tmp,1,0xff);
return ch;
}
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_USART2_UART_Init();
/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart1,&re_buf,1);
HAL_UART_Transmit(&huart2,"les't go\r\n",strlen("les't go\r\n"),100);
HAL_Delay(2000);
connect_wifi();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
//发送数据
HAL_UART_Transmit(&huart2,send,strlen(send),100);
printf(send);
while(!AT_OK) HAL_Delay(50);
AT_OK = 0;
printf("hello\r\n");
while(!send_ok)HAL_Delay(50);
send_ok = 0;
HAL_Delay(2000);
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
这一段依然有问题,就是发送一段时间的数据后,莫名其妙的error或者FAIL