标题:
如何提取51单片机串口接收的数据并转整型?
[打印本页]
作者:
madnick16
时间:
2019-3-23 22:13
标题:
如何提取51单片机串口接收的数据并转整型?
我希望把51单片机串口接收的数据,分别提取后两位,倒数第三第四位,并转换成整形
单片机程序如下:
#include "reg52.h"
#include "stdio.h"
#include "string.h"
#define uchar unsigned char
#define uint unsigned int
void send_byte(uchar by);
void send_string(uchar *p);
void delay(uint n);
uchar rst[]="AT+RST\r\n";
uchar mod[]="AT+CWMODE=3\r\n";
uchar wico[]="AT+CWJAP=\"Nick\",\"qweasdzxc\"\r\n";
uchar sev[]="AT+CIPSTART=\"TCP\",\"192.168.43.31\",8080\r\n";
uchar mods[]="AT+CIPMODE=1\r\n";
uchar sen[]="AT+CIPSEND\r\n";
uchar in[]="in\r\n";
uchar copa[]="bye\r\n";
uint g,y,r;
sbit ght=P2^0;
sbit yht=P2^1;
sbit rht=P2^2;
void UsartInit()
{
SCON=0X50;
T2CON=0X34;
PCON=0X80;
RCAP2H=(65536-39)/256;
RCAP2L=(65536-39)%256;
ES=0;
EA=1;
ET0=1;
ET1=1;
EX0=1;
IT0=1;
EX1=1;
IT1=1;
}
void main()
{
UsartInit();
send_string(rst);
delay(1);
send_string(mod);
delay(1);
send_string(wico);
delay(10);
send_string(sev);
delay(10);
send_string(mods);
delay(5);
send_string(sen);
delay(3);
ES=1;
g=5;
y=2;
r=5;
while(1)
{
ght=0;
yht=1;
rht=1;
delay(g);
ght=1;
yht=0;
rht=1;
delay(y);
ght=1;
yht=1;
rht=0;
delay(r);
}
}
void send_byte(uchar by)
{
SBUF = by;
while(!TI);
TI = 0;
}
void send_string(uchar *p)
{
while(*p!= '\0')
{
send_byte(*p);
p++;
}
}
void delay(uint n)
{
unsigned int i=0;
for(i=0;i<n;i++)
{
#pragma asm
DEL3:MOV R0,#100
DEL2:MOV R1,#100
DEL1:MOV R2,#25
DEL0:NOP
NOP
DJNZ R2,DEL0
DJNZ R1,DEL1
DJNZ R0,DEL2
#pragma endasm
}
}
void Usart() interrupt 4
{
uchar str1;
#include "reg52.h"
#include "stdio.h"
#include "string.h"
#define uchar unsigned char
#define uint unsigned int
void send_byte(uchar by);
void send_string(uchar *p);
void delay(uint n);
uchar rst[]="AT+RST\r\n";
uchar mod[]="AT+CWMODE=3\r\n";
uchar wico[]="AT+CWJAP=\"Nick\",\"qweasdzxc\"\r\n";
uchar sev[]="AT+CIPSTART=\"TCP\",\"192.168.43.31\",8080\r\n";
uchar mods[]="AT+CIPMODE=1\r\n";
uchar sen[]="AT+CIPSEND\r\n";
uchar in[]="in\r\n";
uchar copa[]="bye\r\n";
uint g,y,r;
sbit ght=P2^0;
sbit yht=P2^1;
sbit rht=P2^2;
void UsartInit()
{
SCON=0X50;
T2CON=0X34;
PCON=0X80;
RCAP2H=(65536-39)/256;
RCAP2L=(65536-39)%256;
ES=0;
EA=1;
ET0=1;
ET1=1;
EX0=1;
IT0=1;
EX1=1;
IT1=1;
}
void main()
{
UsartInit();
send_string(rst);
delay(1);
send_string(mod);
delay(1);
send_string(wico);
delay(10);
send_string(sev);
delay(10);
send_string(mods);
delay(5);
send_string(sen);
delay(3);
ES=1;
g=5;
y=2;
r=5;
while(1)
{
ght=0;
yht=1;
rht=1;
delay(g);
ght=1;
yht=0;
rht=1;
delay(y);
ght=1;
yht=1;
rht=0;
delay(r);
}
}
void send_byte(uchar by)
{
SBUF = by;
while(!TI);
TI = 0;
}
void send_string(uchar *p)
{
while(*p!= '\0')
{
send_byte(*p);
p++;
}
}
void delay(uint n)
{
unsigned int i=0;
for(i=0;i<n;i++)
{
#pragma asm
DEL3:MOV R0,#100
DEL2:MOV R1,#100
DEL1:MOV R2,#25
DEL0:NOP
NOP
DJNZ R2,DEL0
DJNZ R1,DEL1
DJNZ R0,DEL2
#pragma endasm
}
}
void Usart() interrupt 4
{
uchar str;
str=SBUF;
RI = 0;//
}
void Iny0() interrupt 0
{
ES=0;
send_string(in);
ES=1;
}
void Iny1() interrupt 2
{
ES=0;
send_string(copa);
ES=1;
}
str1=SBUF;
RI = 0;//
}
void Iny0() interrupt 0
{
ES=0;
send_string(in);
ES=1;
}
void Iny1() interrupt 2
{
ES=0;
send_string(copa);
ES=1;
}
复制代码
作者:
yzwzfyz
时间:
2019-3-23 22:13
想像一下:一个数据流从你面前流过,你如何知道谁是最后一个呢?
无法确定最后一个是谁,又何来倒数呢?
问题的前键就是这个!
也即通讯协议是如何定义:结束标记的!
你先规划一个缓冲区,大小=4个字节+结束标记。每次收到数据就依序放入这个区域(循环放置,并设置一个指针PX,每次输入使PX指向它,目的:可以知道何处是头,何处是尾。)每次输入后,在PX(注意是循环+,要保证不溢出)的地方,判一下是不是结束标记,如何是,则其它地方必是你要的4个字节。
作者:
madnick16
时间:
2019-3-25 21:48
yzwzfyz 发表于 2019-3-24 07:14
想像一下:一个数据流从你面前流过,你如何知道谁是最后一个呢?
无法确定最后一个是谁,又何来倒数呢?
...
可以给个样本程序吗
作者:
我对你情有独钟
时间:
2019-4-5 16:34
按照通信协议来
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1