Arduino sprintf(用于TX)和scanf(用于RX),为什么我会得到奇怪的输出?

时间:2017-11-16 10:19:05

标签: arduino printf scanf

我想知道我的代码中有什么问题 或者它实际上是否正确?

目前我有4个代码保存变量:

  • hDroid(0到4位数)
  • pDroid(0到2位数)
  • ooDroid(0到3位数)
  • devDroid(0到4位数)

我将其输入到字符数组(allcode)中,然后将其传送到它们到达的接收方(希望格式相同?)。

问题是输出有额外的字符,我无法弄清楚原因。它只是Arduino串行监视器吗?

也许我没有设置空字符或没有在每个或所有数组中分配足够的内存。

为了测试sprintfscanf,我已将所有内容都放在同一草图中,这可能就是问题所在。

渴望的是:

  • 发送:1234,12,123,1234
  • 收到:1234,12,123,1234

我的代码是:

//declare "code-holding" vars for send
char hDroid[5] = {
    "1234" }; //4 or less digits/keys eg 1234 + NULL
char pDroid[3] = {
    "21" }; //2 digits/keys eg 12 + NULL
char ooDroid[4] = {
    "123" }; //3 or less digits/keys eg 123 + NULL
char devDroid[5] = {
    "1234" }; //4 or less digits/keys eg 9999 + NULL 
char allDroid[18] = {
    '\0' }; //total array count including NULL's


//declare "code-holding" vars for receive
char hDroid1[5] = {
    '\0' }; //4 or less digits/keys eg 1234 + NULL
char pDroid1[3] = {
    '\0' }; //2 digits/keys eg 12 + NULL
char ooDroid1[4] = {
    '\0' }; //3 or less digits/keys eg 123 + NULL       
char devDroid1[5] = {
    '\0' }; //4 or less digits/keys eg 9999 + NULL 


void setup() {
    Serial.begin(9600);
}

void loop() {
    sprintf(allDroid, "%s,%s,%s,%s", hDroid, pDroid, ooDroid, devDroid);
    Serial.println("This is allDroid "); //show content of allDroid 
    Serial.println(allDroid); //show content of allDroid
    delay(1000);
    sscanf(allDroid, "%s,%s,%s,%s", &hDroid1, &pDroid1, &ooDroid1, &devDroid1); // Converts a string to an array

    Serial.println("this is hDroid1,pDroid1,ooDroid1,devDroid1 "); //show content of allDroid

    Serial.println(hDroid1);

    Serial.println(pDroid1);

    Serial.println(ooDroid1);

    Serial.println(devDroid1);

    //clear the arrays
    memset(allDroid, 0, sizeof(allDroid));// This line is for reset the StringReceived
    memset(hDroid1, 0, sizeof(hDroid1));// This line is for reset the StringReceived
    memset(pDroid1, 0, sizeof(pDroid1));// This line is for reset the StringReceived
    memset(ooDroid1, 0, sizeof(ooDroid1));// This line is for reset the StringReceived
    memset(devDroid1, 0, sizeof(devDroid1));// This line is for reset the StringReceived
}

输出是:

This is allDroid 
1234,21,123,1234
this is hDroid1,pDroid1,ooDroid1,devDroid1 
1234,21,123,1234
21,123,1234
123,1234
1234

2 个答案:

答案 0 :(得分:1)

好的,我今天有时间。我运行你的代码,它的工作非常好。这是我的输出。我使用的是最新的Arduino IDE,我的主板是Arduino Nano。

我认为垃圾值是因为旧的ide串行监视器。只需使用升级后的IDE。

enter image description here

答案 1 :(得分:0)

似乎只有在arduino IDE 1.0.5-r2上使用串行监视器时,我在Arduino IDE 1.6.5版本上尝试了相同的代码,并且'奇怪的字符从输出窗口消失了! This is allDroid 1234,21,123,1234 this is hDroid1,pDroid1,ooDroid1,devDroid1 1234,21,123,1234 作为一个完整性检查可以某种灵魂,请检查我的代码在数组及其维度和Null终止方面的正确性?