通过串口发送后无法获得原始值

时间:2019-08-14 18:33:20

标签: c++ arduino c++14

我编写了一个简单的代码,用于使用蓝牙串行端口发送int值。

发射器:

#include <SoftwareSerial.h>
#include "PWM.hpp"

PWM PWM(2);
SoftwareSerial BTSerial(8,9);

void setup()
{
  Serial.begin(9600);   
  Serial.println("Go");
  BTSerial.begin(9600);  
  BTSerial.write("AT+INQ\r\n");
  delay(10000); 
  BTSerial.write("AT+CONN1\r\n");
  delay(100);
  PWM.begin(true);
}

void loop()
{
  int pwmValue = PWM.getValue();
  Serial.println(pwmValue);
  BTSerial.write(pwmValue); 
  delay(100);
}

发送器部分Serial.println的输出正确:

1500

但是在接收器部分却没有。这是接收方的代码:

#include <SoftwareSerial.h>

SoftwareSerial BTSerial(8, 9);

void setup() {
  Serial.begin(9600);
  BTSerial.begin(9600);
  BTSerial.write("AT+NAME=Remote\r\n");
}

void loop() {

 if (BTSerial.available()) {
  int pwmValue = BTSerial.read();
  Serial.println(pwmValue);
 }

Serial.println的错误输出是:

220

我认为问题出在打字方面。

3 个答案:

答案 0 :(得分:2)

SoftwareSerial::read返回单个字节读取。 如果您以十六进制检查期望的1500,则为0x05DC,而其低字节为0xDC,正好为十进制的220

答案 1 :(得分:1)

对于write()的多字节变体,您可以使用:

BTSerial.write(&pwmValue, sizeof pwmValue);

要接收,您需要循环:

union {
    int  i;
    char c[0];
} pwmValue;
int receivedBytes = 0;

void loop() {
    if (BTSerial.available()) {
        pwmValue.c[receivedBytes] = BTSerial.read();
        receivedBytes++;
        if (receivedBytes == sizeof pwmValue) {
            Serial.println(pwmValue.i);
            receivedBytes = 0;
        }
    }
}

答案 2 :(得分:0)

在文档https://github.com/PaulStoffregen/SoftwareSerial/blob/master/SoftwareSerial.cpp中,您可以看到这两个函数都可以使用uint_8t -保证具有8位(1字节)。最多可容纳256个值,因此 1500 mod 256为220

看起来库准备只传输char大小的数据,因此您需要在这两个大小上转换更大的数字。

用于发送int:

int n = pwmValue;

while (n > 0) {
    int digit = n % 10;
    n = n / 10;
    BTSerial.write(digit);
}

用于接收int:

int n = 0; //future result
int decs = 1;
int temp;

while ((temp = BTSerial.read()) != -1) {
    n += temp * decs;
    decs *= 10;
}