找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2325|回复: 7
打印 上一主题 下一主题
收起左侧

单片机串口通信,怎么添加算法

[复制链接]
跳转到指定楼层
楼主

接受数据后,对receiveData进行算法处理,比如加上5,或者乘以5之类的,最后返回电脑是计算好的值。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2018-5-4 17:53 | 只看该作者
此处注释只是告诉你可以对收到的数据进行处理,如无此必要就不必处理,就按原样回传给上位机。
回复

使用道具 举报

板凳
ID:302865 发表于 2018-5-4 20:07 | 只看该作者
wulin 发表于 2018-5-4 17:53
此处注释只是告诉你可以对收到的数据进行处理,如无此必要就不必处理,就按原样回传给上位机。

不是,这是我注释的,我想在这里添加算法,如果直接用加法或者乘法,比如10加2,结果会显示32.(两位同时相加了)
回复

使用道具 举报

地板
ID:213173 发表于 2018-5-4 20:31 | 只看该作者
sacredyy 发表于 2018-5-4 20:07
不是,这是我注释的,我想在这里添加算法,如果直接用加法或者乘法,比如10加2,结果会显示32.(两位同时 ...

串口助手按16进制数或字符传送,在上位机发10其实是0x10,就是16,乘以2当然是32,你再把32回传,在串口助手上显示20.
回复

使用道具 举报

5#
ID:322318 发表于 2018-5-4 20:55 | 只看该作者
可以给你一个最简单的串口计算器的程序参考一下。
回复

使用道具 举报

6#
ID:322318 发表于 2018-5-4 20:58 | 只看该作者
#include "reg52.h"
#include "string.h"
#include "stdlib.h"
#include "stdio.h"
#define uchar unsigned char
#define uint unsigned int
unsigned char flag,c;
uchar receivedata[12] ;
double number1,number2,result1;
uint number3,number4;
uchar number[1][4] ;
uint length,count,i,point,j,k,result2;
uchar yunsuanfu;
uchar senddata[10];
void UsartInit()
{
SCON=0x50;
TMOD=0X20;
PCON=0X80;
TH1=0XF3;
TL0=0XF3;
ES=1;
EA=1;
TR1=1;
}

void Usart() interrupt 4
{
if(RI==1)
{
receivedata[count]=SBUF;
if(receivedata[count]=='=')
{
flag=1;
length=count;
}
count++;
RI=0;
}
}

void main()
{
UsartInit();
while(1)
{
if(flag==1)
{
ES=0;
while(receivedata[i])
{
if(receivedata[i]=='=')
break;
if((receivedata[i]>=48 && receivedata[i]<=57) || receivedata[i]=='.')
{
if(receivedata[i]=='.')
point=1;
number[j][i-k]=receivedata[i];
i++;
}
else
{
yunsuanfu=receivedata[i];
i++;
k=i;
j++;
}
}

if(point==1)
{
number1=atof(number[0]);
number2=atof(number[1]);
switch(yunsuanfu)
{
case '+':result1=number1+number2;break;
case '-':result1=number1-number2;break;
case '*':result1=number1*number2;break;
case '/':result1=number1/number2;break;
default: break;
}
sprintf(senddata,"%.3f",result1);
}
else
{
number3=atoi(number[0]);
number4=atoi(number[1]);
switch(yunsuanfu)
{
case '+':result2=number3+number4;break;
case '-':result2=number3-number4;break;
case '*':result2=number3*number4;break;
case '/':result2=number3/number4;break;
default: break;
}
sprintf(senddata,"%d",result2);
}
for(c=0;c<10;c++)
{
SBUF=senddata[c];
while(!TI);
TI=0;
}
ES=1;
flag=0;
}
}
}


你发送的字符,程序的操作对象其实是它的ASCII码,你可以先用函数转化成整型或者浮点型数
Atof()函数:
其作用是把括号内的一个字符串转化为浮点数:
Atoi()函数:
其作用是把括号内的一个字符串转化为整数;
Sprintf()函数:
其作用是将一个数变成字符串存到一个数组中去;
sprintf(senddata,"%d",result2);例如这个的意思就是把数据result2变成字符串再存到senddata数组中去。
回复

使用道具 举报

7#
ID:318768 发表于 2018-5-4 21:04 | 只看该作者
你可以用 printf函数 试试,可好玩了
回复

使用道具 举报

8#
ID:302865 发表于 2018-5-9 10:31 | 只看该作者
hexinghua666 发表于 2018-5-4 20:58
#include "reg52.h"
#include "string.h"
#include "stdlib.h"

请问输入 5*2=   ,结果输出为0,是什么原因
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表