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;
}

浙公网安备 33010602011771号