Arduino:字符串到多个变量
Arduino: string to multiple variables
我正在尝试通过 433MHz 无线电通信从两个传感器发送数据。我已成功发送和接收字符串(char 数组)"number1,number2".
现在我试图将两个数字存储在单独的 int 变量中(值超过 256)。
我几乎尝试了所有方法(主要是 sscanf 和 atoi),但它似乎不起作用。
到A0和A1我连接了两个电位器,我想将其值存储在 valorX 和 valorY 中 在接收器 arduino 中。
你有什么建议?
我不能保证我正确使用了 sscanf 和 atoi。
Transmitter code:
#include <VirtualWire.h>
int xvalue;
int yvalue;
void setup() {
Serial.begin(9600);
vw_set_ptt_inverted(true); //
vw_set_tx_pin(12);
vw_setup(4000);// speed of data transfer Kbps
}
void loop() {
xvalue=analogRead(A0);
yvalue=analogRead(A1);
int envioX = map(xvalue, 0, 1023, 001, 1000); //I prefer to not send 0
int envioY = map(yvalue, 0, 1023, 001, 1000);
//Mando los datos del joystic
char envioXY[]="";
sprintf(envioXY,"%d,%d",envioX,envioY);
EnviarDatos(envioXY);
delay(1000);
}
void EnviarDatos(char datos[]){
vw_send((uint8_t *)datos, strlen(datos)); //vw_send(message, length)
vw_wait_tx(); // Wait until the whole message is gone
}
Receiver code:
#include <VirtualWire.h>
char recibo[8]="";
int valorX;
int valorY;
void setup(){
vw_set_ptt_inverted(true); // Required for DR3100
vw_set_rx_pin(12);
vw_setup(4000); // Bits per sec
vw_rx_start(); // Start the receiver PLL running
Serial.begin(9600);
Serial.println("setup");
}
void loop(){
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)){ //check to see if anything has been received
for(int i=0;i<buflen;i++){
recibo[i]=char(buf[i]);
Serial.print(recibo[i]);
}
recibo[buflen]=NULL;
//String str(recibo);
//What here to get both int??
}
}
你有什么建议?
我不能保证我正确使用了 sscanf 和 atoi。
所以主要问题是如何将"number1,number2"转换为int1=number1和int2=number2。
感谢和欢呼
加布里埃尔
发射器代码:
您必须声明要供 sprintf
使用的存储空间。您只声明了一个包含 NUL(0 字节)的 1 字节数组作为第一个也是唯一的元素 [0]:
char envioXY[]="";
改成这样,声明一个24个元素的字符数组:
char envioXY[ 24 ];
虽然未初始化,sprintf
将在格式化您的 2 个整数时设置数组元素。
收件人代码:
在recibo[buflen] = NULL;
之后,你可以这样解析:
sscanf( recibo, "%d,%d", &valorX, &valorY );
格式字符串匹配sprintf
格式,传入两个整数的地址,不只是两个整数
我正在尝试通过 433MHz 无线电通信从两个传感器发送数据。我已成功发送和接收字符串(char 数组)"number1,number2".
现在我试图将两个数字存储在单独的 int 变量中(值超过 256)。
我几乎尝试了所有方法(主要是 sscanf 和 atoi),但它似乎不起作用。
到A0和A1我连接了两个电位器,我想将其值存储在 valorX 和 valorY 中 在接收器 arduino 中。
你有什么建议? 我不能保证我正确使用了 sscanf 和 atoi。
Transmitter code:
#include <VirtualWire.h>
int xvalue;
int yvalue;
void setup() {
Serial.begin(9600);
vw_set_ptt_inverted(true); //
vw_set_tx_pin(12);
vw_setup(4000);// speed of data transfer Kbps
}
void loop() {
xvalue=analogRead(A0);
yvalue=analogRead(A1);
int envioX = map(xvalue, 0, 1023, 001, 1000); //I prefer to not send 0
int envioY = map(yvalue, 0, 1023, 001, 1000);
//Mando los datos del joystic
char envioXY[]="";
sprintf(envioXY,"%d,%d",envioX,envioY);
EnviarDatos(envioXY);
delay(1000);
}
void EnviarDatos(char datos[]){
vw_send((uint8_t *)datos, strlen(datos)); //vw_send(message, length)
vw_wait_tx(); // Wait until the whole message is gone
}
Receiver code:
#include <VirtualWire.h>
char recibo[8]="";
int valorX;
int valorY;
void setup(){
vw_set_ptt_inverted(true); // Required for DR3100
vw_set_rx_pin(12);
vw_setup(4000); // Bits per sec
vw_rx_start(); // Start the receiver PLL running
Serial.begin(9600);
Serial.println("setup");
}
void loop(){
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)){ //check to see if anything has been received
for(int i=0;i<buflen;i++){
recibo[i]=char(buf[i]);
Serial.print(recibo[i]);
}
recibo[buflen]=NULL;
//String str(recibo);
//What here to get both int??
}
}
你有什么建议? 我不能保证我正确使用了 sscanf 和 atoi。
所以主要问题是如何将"number1,number2"转换为int1=number1和int2=number2。
感谢和欢呼 加布里埃尔
发射器代码:
您必须声明要供 sprintf
使用的存储空间。您只声明了一个包含 NUL(0 字节)的 1 字节数组作为第一个也是唯一的元素 [0]:
char envioXY[]="";
改成这样,声明一个24个元素的字符数组:
char envioXY[ 24 ];
虽然未初始化,sprintf
将在格式化您的 2 个整数时设置数组元素。
收件人代码:
在recibo[buflen] = NULL;
之后,你可以这样解析:
sscanf( recibo, "%d,%d", &valorX, &valorY );
格式字符串匹配sprintf
格式,传入两个整数的地址,不只是两个整数