MSP430使用wifi模块接收数据

说明:小学期需要,非专业单片机玩家

可看作是 MSP430使用wifi模块发送数据(下,发送数据)系列的一点补(mo)充(fang),代码也是拿大佬的直接修改。
同时也建议先读大佬的文章。

#include <msp430f5529.h>

#define uchar unsigned char

uchar buffer[] = {"hello world\n"};

// 启用通信接口, 波特率设置为115200,与wifi模块的要求相同
void setUart(){
  P4SEL = BIT4 +BIT5;           // 设置 4.4 和 4.5 为输出位
  UCA1CTL1 |= UCSWRST;          // **Put state machine in reset**
  UCA1CTL1 |= UCSSEL_2;         // CLK = SMCLK   MCLK = SMCLK = default DCO = 32 x ACLK = 1048576Hz
  UCA1BR0 = 0x09;               // 1048576/115200 = ~9.10 (see User's Guide)
  UCA1BR1 = 0x00;               
  UCA1MCTL = UCBRS_1+UCBRF_0;   // Modulation UCBRSx=3, UCBRFx=0
  UCA1CTL1 &= ~UCSWRST;         // **Initialize USCI state machine**
}

// 输出字符串
void uartPrint(uchar code[], int len){
  unsigned int i;
  for(i=0; i<len; i++){
    UCA1TXBUF = code[i];
    while (!(UCA1IFG&UCTXIFG)); 
  }
}

// 主程序
void main(void)
{
  // 停止看门狗
  WDTCTL=WDTPW+WDTHOLD;
  // 对于2.1的设置是为了使用按钮
  // 设置2.1为输入位, 接上拉电阻, 设置初始值为高电平
  P2DIR &=~ BIT1; P2REN |= BIT1; P2OUT |= BIT1;
  // 允许2.1触发中断, 中断标志位复位,设置中断
  P2IES &=~ BIT1; P2IFG &=~ BIT1; P2IE |= BIT1;
  // 初始化输出设置
  setUart();
  // CPU休息,GIE:打开全局中断使能
  P1DIR |= BIT0;
  while(1){
    
    if(UCA1RXBUF=='s'){
      P1OUT |= BIT0; 
    }else {
      P1OUT &= ~BIT0; 
    }
    while (!(UCA1IFG&UCRXIFG)); 
  
  };
  __bis_SR_register(LPM0_bits +GIE);
  // 停止操作指令
  __no_operation();
}

// 进入中断
#pragma vector = PORT2_VECTOR
__interrupt void Port_2(void)
{
  // 发一条数据
  uartPrint(buffer, sizeof(buffer));
  // 清除标志位
  P2IFG &=~ BIT1;
}

这段代码在以上博客所提到的基础上增加了单片机接收数据部分。在测试时你可以通过在server端发送字符's'来修改相关端口输出状态(亮灯),如果发送的为其它字符则修改相关端口未另一状态(灭灯).
一些说明:
UCTXIFG是发送中断标志位,当发送缓冲器为空时被置位。
while(!(UCA1IFG&UCTXIFG))即当两个寄存器任一个置零后即结束循环(结束阻塞)发送/接收下一个数据。
UCA1IFG寄存器作用暂时没搞懂,懂了再加。
觉着手机端的网络调试助手不好使,简单写了个PC端的。不保证无BUG,不提供使用教程(请自行参考查找本机内网IP的相关内容,端口19730)
链接:https://share.weiyun.com/w0h7Yqe0 密码:ceywgx
参考资料:
https://blog.csdn.net/weixin_49736959/article/details/108378724
https://blog.csdn.net/weixin_43830248/article/details/85219710

------2020.9.4 14:51再更
串口数据读写写法2:
void mswrite(char ptr){
while(
ptr != '\0')
{
while (!(UCA1IFG&UCTXIFG));
UCA1TXBUF = *ptr++;
}
while (!(UCA1IFG&UCTXIFG));
}
-----2020.9.4 15:17更
完成单片机控制联网
一个比较完整的demo: 通电后约45s(或者tcp server端完成登录后约7s完全完成连接,可按p2中断向server发送"hello dy")
注意修改相关信息(wifi连接和tcp服务器IP:端口)

#include <msp430f5529.h>

#define uchar unsigned char
#define CPU_F ((double)1024*1024)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))

uchar buffer[] = {"hello world\n"};
uchar wifi1[] = {"AT+CWJAP=\"dy\",\"a1234567\"\r\n"};
uchar wifi2[] = {"AT+CIPSTART=\"TCP\",\"192.168.137.1\",19730\r\n"};
// 启用通信接口, 波特率设置为115200,与wifi模块的要求相同
void setUart(){
  P4SEL = BIT4 +BIT5;           // 设置 4.4 和 4.5 为输出位
  UCA1CTL1 |= UCSWRST;          // **Put state machine in reset**
  UCA1CTL1 |= UCSSEL_2;         // CLK = SMCLK   MCLK = SMCLK = default DCO = 32 x ACLK = 1048576Hz
  UCA1BR0 = 0x09;               // 1048576/115200 = ~9.10 (see User's Guide)
  UCA1BR1 = 0x00;               
  UCA1MCTL = UCBRS_1+UCBRF_0;   // Modulation UCBRSx=3, UCBRFx=0
  UCA1CTL1 &= ~UCSWRST;         // **Initialize USCI state machine**
}

// 输出字符串
void  mswrite(char *ptr){
  while(*ptr != '\0')
  {
    while (!(UCA1IFG&UCTXIFG));
    UCA1TXBUF = *ptr++;
  }
  while (!(UCA1IFG&UCTXIFG));
}

void esp_config(){
  mswrite("AT+RST\r\n");
  delay_ms(15000);
  mswrite("AT+CWMODE=1\r\n");
  delay_ms(5000);
  mswrite("AT+CWJAP=\"dy\",\"a1234567\"\r\n");
  delay_ms(15000);
  mswrite("AT+CIPSTART=\"TCP\",\"192.168.137.1\",19730\r\n");
  delay_ms(2000);
  mswrite("AT+CIPMODE=1\r\n");
  delay_ms(5000);
  mswrite("AT+CIPSEND\r\n");
}
// 主程序
void main(void)
{
  // 停止看门狗
  WDTCTL=WDTPW+WDTHOLD;
  // 对于2.1的设置是为了使用按钮
  // 设置2.1为输入位, 接上拉电阻, 设置初始值为高电平
  P2DIR &=~ BIT1; P2REN |= BIT1; P2OUT |= BIT1;
  // 允许2.1触发中断, 中断标志位复位,设置中断
  P2IES &=~ BIT1; P2IFG &=~ BIT1; P2IE |= BIT1;
  // 初始化输出设置
  setUart();
  // CPU休息,GIE:打开全局中断使能
  int i;
  P1DIR |= BIT0;
  //while(1){
    
   // if(UCA1RXBUF=='s'){
  //    P1OUT |= BIT0; 
   // }else {
   //   P1OUT &= ~BIT0;  }
   // while (!(UCA1IFG&UCRXIFG)); 
    
   // for(i=0;i<32000;i++);
    //delay_ms(1000);
    //P1OUT ^= BIT0;
    
 // };
  esp_config();
  __bis_SR_register(LPM0_bits +GIE);
  // 停止操作指令
  __no_operation();
}

// 进入中断
#pragma vector = PORT2_VECTOR
__interrupt void Port_2(void)
{
  
  // 发一条数据
 // mswrite2("hello world",sizeof("hello world"));
  mswrite("hello dy");
  // 清除标志位
  P2IFG &=~ BIT1;
}
posted @ 2020-09-03 23:04  _Knight  阅读(711)  评论(0)    收藏  举报