极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10694|回复: 3

关于Arduino发送6个AD转换结果组成字符串发送问题

[复制链接]
发表于 2013-9-22 13:29:52 | 显示全部楼层 |阅读模式
最近用Arduino做一个简单的模拟数据采集,想用6个模拟输入端口采集6路模拟电压值,可是采集之后没有办法将这6个转换结果构成一个长的字符串进行发送,而且0~1023转化的数字大小不同,发送的字节也不同,这就给字符串的解析带来了很大的困难,有没有哪位大神遇到过这方面的问题,是怎么解决的?求学习...
回复

使用道具 举报

发表于 2013-9-23 00:16:01 | 显示全部楼层
同问~~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-23 10:23:48 | 显示全部楼层
这是我用2个AD转换做的,用了Serial.println()这个函数,在上位机处理的时候将换行符之前的字符串进行了匹配,效果还行,但是发送的字节数有一点多,0-9数据占一个字节,10-99数据占两个字节,100-999占三个字节,1000-1023占四个字节,再加上换行符,6个AD转换的话发送的字节数过于多了,我也想过将其千位、百位、十位、各位分别发送,但是现在还没有试验成功,对于Arduino下层的一些设置还不是很清楚,不知道大家有什么良策...

int LED=13;
int a;

int AD_Value0=0;               //AD转换后的数字量
int AD_Value1=0;               //AD转换后的数字量
//float float_AD_Value;         //数字量换算成浮点电压量

void setup()
{
  Serial.begin(9600);
  pinMode(LED,OUTPUT);
}

void loop()
{
  if(Serial.available())
  {
    a=Serial.read();
  if(a==0xAA)
    {
      digitalWrite(LED,1);
      
      AD_Value0=analogRead(A0);
     
     // delay(20);
      AD_Value1=analogRead(A2);
      
      Serial.println(AD_Value0);
      Serial.println(AD_Value1);     
      
      digitalWrite(LED,0);
    }
   }
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-23 11:30:20 | 显示全部楼层
千位、百位、十位、各位分别发送,我试了一下,还是挺好的,在上位机中分别进行解析和运算,再转化为0-1023的值,6个的话一共需要发24个字节,这样发送的数据也缩小了一些。我觉得0-1023的数值可以只用两个字节搞定的,我用单片机的时候用位运算,一个字节表示0-255,两个字节完全可以表示0-1023了,但是Arduino中还没有实现,大家可有什么好的办法,这样发送的数据字节又可以减少一半了{:soso_e100:} 。

Arduino代码,上位机只需要把每一位提取出来加权运算即可;

int wei[4];
int LED=13;
int a;

int AD_Value0=0;               //AD转换后的数字量
int AD_Value1=0;               //AD转换后的数字量

void SendData(int x)
{
  int j;
  wei[0] = x / 1000;
  wei[1] = x % 1000 / 100;
  wei[2] = x % 100 / 10;
  wei[3] = x % 10;
  for(j=0;j<4;j++)
  {
    Serial.write((byte)wei[j]);  
  }
}

void setup()
{
  Serial.begin(9600);
  pinMode(LED,OUTPUT);
}

void loop()
{
  if(Serial.available())
  {
    a=Serial.read();
  if(a==0xAA)
    {
      digitalWrite(LED,1);
      
      AD_Value0=analogRead(A0);
      AD_Value1=analogRead(A2);
      
      SendData(AD_Value0);
      SendData(AD_Value1);   
      
//      Serial.println(AD_Value0);
//      Serial.println(AD_Value1);     
     
      digitalWrite(LED,0);
    }
   }
}
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-6 00:27 , Processed in 0.040451 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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