我编写了一个简单的代码,用于使用蓝牙串行端口发送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
我认为问题出在打字方面。
答案 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;
}