极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13015|回复: 3

上一个代码问题解决了,现在提取数组中的数出了问题

[复制链接]
发表于 2016-5-8 20:25:45 | 显示全部楼层 |阅读模式
如何主机向从机发送多字节的问题算是解决了,但是我想在从机中用这个数,但是出了问题。
主机
  1. #include <Wire.h>

  2. #define SLAVE_ADDRESS 0x12
  3. #define SERIAL_BAUD 9600


  4. void setup()
  5. {
  6.   Wire.begin();

  7.   Serial.begin(SERIAL_BAUD);
  8.   Serial.println("I2C Master.02 started");
  9.   Serial.println();
  10. }


  11. void loop()
  12. {
  13.   if (Serial.available()) {
  14.     Wire.beginTransmission(SLAVE_ADDRESS);
  15.     while(Serial.available()) {
  16.       Wire.write(Serial.read());
  17.       delay(50);
  18.     }
  19.     Wire.endTransmission();
  20.   }
  21. }
复制代码


从机
  1. #include <Wire.h>
  2. #include <HX711.h>
  3. #include <Stepper.h>

  4. #define SLAVE_ADDRESS 0x12
  5. #define SERIAL_BAUD 9600
  6. #define STEPS 100// 这里设置步进电机旋转一圈是多少步
  7. Stepper stepper(20, 10, 11);// attached to设置步进电机的步数和引脚
  8. HX711 hx(6, 7, 128,0.00237642);

  9. #define I2C_BUFFER_SIZE 32  
  10. uint8_t i2cBuffer[I2C_BUFFER_SIZE];
  11. uint8_t i2cBufferCnt = 0;
  12. boolean dataPending = false;

  13. void setup() {
  14.   Wire.begin(SLAVE_ADDRESS);    // join I2C bus as a slave with address 1
  15.   Wire.onReceive(receiveEvent); // register event

  16.   Serial.begin(SERIAL_BAUD);
  17.   Serial.println("I2C Slave.03 started\n");
  18.   stepper.setSpeed(5000);      // 设置电机每分钟的转速为5000步
  19.   hx.set_offset(390800);
  20. }

  21. void loop() {
  22.   if (dataPending) {
  23.     Serial.println("Receive Data:");
  24.     for (int idx = 0; idx < i2cBufferCnt; idx++) Serial.print((char) i2cBuffer[idx]);
  25.     Serial.println("\n");  
  26.     dataPending = false;
  27.     char c = 1000*i2cBuffer[0]+100*i2cBuffer[1]+10*i2cBuffer[2]+i2cBuffer[3];
  28.     Serial.println(c,DEC);
  29.    
  30.     Serial.println("measure Data:");
  31.     int sum0 = 0;
  32.     int sum1 = 0;
  33.     for (int i = 0; i < 10; i++) {
  34.       sum0 += hx.read();
  35.       sum1 += hx.bias_read();
  36.    }
  37.      Serial.print(sum0/10);
  38.      Serial.print(" ");
  39.      Serial.println(sum1/10);
  40.      stepper.step(sum1/10-c);
  41.      Serial.println("\n");
  42.   
  43.   }
  44. }

  45. void receiveEvent(int count) {
  46.   i2cBufferCnt = 0;
  47.   while(Wire.available()) {
  48.     i2cBuffer[i2cBufferCnt++] = Wire.read();
  49.   }
  50.   dataPending = true;
  51. }
复制代码


问题出现在这行,char c = 1000*i2cBuffer[0]+100*i2cBuffer[1]+10*i2cBuffer[2]+i2cBuffer[3];
    Serial.println(c,DEC);
在主机串口输入4位数,如0546,从机串口上,接受并显示没有问题,但是从数组中提取,也就是这行,显示的C不是0546,是另外的一个数,输入其他的也是,C会变成另一个,求教这是哪里出错了?
回复

使用道具 举报

 楼主| 发表于 2016-5-8 21:44:29 | 显示全部楼层
做个测试,如图 主机先输了1234结果c=-10974  ,故意调小点 主机0023,结果c=-12185

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2016-5-9 18:33:42 | 显示全部楼层
你看看多字符发过去的是什么类型的,有可能是按照ascii码发过去的,你检查一下
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-5-9 21:00:19 | 显示全部楼层
zjz5717 发表于 2016-5-9 18:33
你看看多字符发过去的是什么类型的,有可能是按照ascii码发过去的,你检查一下

已经解决了  是这个原因  谢谢了
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-5 21:16 , Processed in 0.040575 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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