传感器通过485通讯发送数据给单片机,然后单片机通过WiFi发送到电脑,但是数据一直都是错误的。。。。 5
用的是发送九位数据的传感器,WiFi模块是ESP8266,电脑接到的数据都是错误的,并不是传感器的数据,不知道问题出在哪,请大神求救#include<reg52.h>#i...
用的是发送九位数据的传感器,WiFi模块是ESP8266,电脑接到的数据都是错误的,并不是传感器的数据,不知道问题出在哪,请大神求救
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS485_DIR = P1^7; //RS485方向选择引脚
uchar bufRxd[9]={0};
uint num0=0;
uint cnt=0;
void g485_init()
{
RS485_DIR = 0; //RS485设置为接收方向
TMOD |= 0x20; //配置T1为模式2
TH1 = 0xfd; //计算T1重载值9600
TL1 = 0xfd; //初值等于重载值
SCON = 0x50; //配置串口为模式1
ES = 1; //使能串口中断
TR1 = 1; //启动T1
REN = 1;
EA = 1;
}
void DelayX10us(uchar t)
{
do {
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
} while (--t);
}
void g485_send(uchar dat)
{
RS485_DIR = 1;
SBUF = dat;
while(!TI);
TI = 0;
DelayX10us(5);
RS485_DIR = 0;
}
void gy_cmd1();
void init_esp();
void main()
{
uint a = 0;
g485_init();
init_esp();
while(1)
{
gy_cmd1();
TI = 1;
EA = 0;
for (a=0; a<20000; a++);
printf ("AT+CIPSEND=0,4\n");
for (a=0; a<20000; a++);
printf ("%d\n",num0);
DelayX10us(10);
TI = 0;
EA = 1;
}
}
void gy_cmd1()
{
g485_send(0xA5);
g485_send(0x09);
g485_send(0xAE);
}
void init_esp()
{
uint a;
TI = 1;
ES = 0;
for (a=0; a<50000; a++); //延时几秒,让模块有时间启动
printf ("AT+CWMODE=2\n"); //设置为softAP模式
for (a=0; a<30000; a++);
printf ("AT+RST\n"); //重新启动模块
for (a=0; a<50000; a++);
printf ("AT+CIPMUX=1\n"); //启动多连接
for (a=0; a<20000; a++);
printf ("AT+CIPSERVER=1,8080\n");
for (a=0; a<20000; a++);
TI = 1;
ES = 1;
}
//char cnt;
/* 串口中断服务函数 */
void InterruptUART() interrupt 4
{
if (RI) //接收到新字节
{
RI = 0; //清零接收中断标志位
if (cnt < 9) //接收缓冲区尚未用完时,
{ //保存接收字节,并递增计数器
bufRxd[cnt++] = SBUF;
}
if(cnt == 8)
{
uint a = 0;
cnt = 0;
num0 = (bufRxd[4]<<24)|(bufRxd[5]<<16)|(bufRxd[6]<<8)|(bufRxd[7]);
num0 = num0/100;
gy_cmd1();
}
}
} 展开
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS485_DIR = P1^7; //RS485方向选择引脚
uchar bufRxd[9]={0};
uint num0=0;
uint cnt=0;
void g485_init()
{
RS485_DIR = 0; //RS485设置为接收方向
TMOD |= 0x20; //配置T1为模式2
TH1 = 0xfd; //计算T1重载值9600
TL1 = 0xfd; //初值等于重载值
SCON = 0x50; //配置串口为模式1
ES = 1; //使能串口中断
TR1 = 1; //启动T1
REN = 1;
EA = 1;
}
void DelayX10us(uchar t)
{
do {
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
} while (--t);
}
void g485_send(uchar dat)
{
RS485_DIR = 1;
SBUF = dat;
while(!TI);
TI = 0;
DelayX10us(5);
RS485_DIR = 0;
}
void gy_cmd1();
void init_esp();
void main()
{
uint a = 0;
g485_init();
init_esp();
while(1)
{
gy_cmd1();
TI = 1;
EA = 0;
for (a=0; a<20000; a++);
printf ("AT+CIPSEND=0,4\n");
for (a=0; a<20000; a++);
printf ("%d\n",num0);
DelayX10us(10);
TI = 0;
EA = 1;
}
}
void gy_cmd1()
{
g485_send(0xA5);
g485_send(0x09);
g485_send(0xAE);
}
void init_esp()
{
uint a;
TI = 1;
ES = 0;
for (a=0; a<50000; a++); //延时几秒,让模块有时间启动
printf ("AT+CWMODE=2\n"); //设置为softAP模式
for (a=0; a<30000; a++);
printf ("AT+RST\n"); //重新启动模块
for (a=0; a<50000; a++);
printf ("AT+CIPMUX=1\n"); //启动多连接
for (a=0; a<20000; a++);
printf ("AT+CIPSERVER=1,8080\n");
for (a=0; a<20000; a++);
TI = 1;
ES = 1;
}
//char cnt;
/* 串口中断服务函数 */
void InterruptUART() interrupt 4
{
if (RI) //接收到新字节
{
RI = 0; //清零接收中断标志位
if (cnt < 9) //接收缓冲区尚未用完时,
{ //保存接收字节,并递增计数器
bufRxd[cnt++] = SBUF;
}
if(cnt == 8)
{
uint a = 0;
cnt = 0;
num0 = (bufRxd[4]<<24)|(bufRxd[5]<<16)|(bufRxd[6]<<8)|(bufRxd[7]);
num0 = num0/100;
gy_cmd1();
}
}
} 展开
1个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询