【问题标题】:Echo the data that is sent by Linux to Arduino回显 Linux 发送到 Arduino 的数据
【发布时间】:2012-08-22 15:14:33
【问题描述】:

我想将 Linux 发送到 Arduino 的数据回显,这是一个十六进制命令,因为我需要回显的数据供 PHP 读取。问题是我不想使用换行符来打印完整的数据。当 Arduino 没有更多数据可以读取时,我想打印它。代码如下:

我想要完成的事情:

  1. 如果没有\n,如何发现读取序列的结尾
  2. 如何以所需格式打印十六进制。

Arduino 代码:

char printByte[100];
byte getByte;
int pos = 0;
void setup(){
    Serial.begin(9600);
}

void loop(){
    if(Serial.available() > 0){
        getByte = Serial.read();
        printByte[pos] = getByte;
        pos++;
        printByte[pos] = '\0';

        if(getByte == '\n'){
            Serial.print(printByte);
            for(int i=0; i<=sizeof(printByte);i++){
                printByte[i]=0;
            }
            pos = 0;
        }
    }
}

发送十六进制的Linux示例代码..

unsigned char pCom[2][7]={{0xFF,0x01,0x00,0x10,0x2F,0x2F,0x6F},
                            {0xFF,0x01,0x00,0x08,0x2F,0x2F,0x67}};

write(fd,pCom[0],8);

另外,我如何在 Arduino 代码中精简,比如 0x,所以它只会输出 FF 01 10 等?

【问题讨论】:

  • 这里似乎有两个问题:(1)如果没有 \n,如何发现读取序列的结尾(2)如何以所需格式打印十六进制。我建议你把它分成两个单独的问题。
  • 是的,这就是我想说的..我会去编辑它..谢谢..
  • 明确一点 - 我的意思是把它编辑成一个问题,然后为第二个问题创建一个新页面。

标签: php c linux arduino


【解决方案1】:

你想做的事情(几乎)可以通过替换来完成

Serial.print(printByte);
for(int i=0; i<=sizeof(printByte);i++){
   printByte[i]=0;
}

与

Serial.print(printByte);

for(int i=0; i<=sizeof(printByte);i++){
   if (0 == printByte[i])
       break;
   printf("%02x", printByte[i]);
}
printf("\n"); // Newline after output

if (0 == strpos(printByte, "QUIT"))
{
    // The cycle ends.
}

for(int i=0; i<=sizeof(printByte);i++){
   printByte[i]=0;
}

更新:Serial.print() 命令是输出 0xFF...:我不明白你想修改输出 Arduino 端。那,我不知道如何实现,需要修改 Serial 包的源代码。那里会有一个“0x%02x”或“0x02X”,必须从中删除0x。

关于读取序列的结束,您可能会输出一个双精度\n。那么,如果读取的字节为\n 且 pos为0,则表示Arduino写了一个空行,序列已停止。

或者您可以使用几乎任何序列作为终止符:在上面的代码中,我添加了对字符串“QUIT”的检查。

【讨论】:

  • 嗨,用您的代码替换我的代码后,我似乎无法从我的序列中获得输出。如果我做对了,你能看看它吗.. if(getByte = = '\n'){ Serial.print(printByte); for(int i=0; i
  • 感谢您的帮助,非常感谢.. 会尝试你告诉我的所有事情..
【解决方案2】:

您的第一个问题是如何知道何时停止读取,如果您不使用“\n”终止数据包/命令/任何内容。

答案是您必须构建一些方法来了解要读入协议的内容。串行通信中没有任何内在的东西可以告诉您序列何时结束。它只是一个字节流。

  • 像 \n 这样的分隔符是一种常用的方法(如果您看到您已经阅读了分隔符,请停止)
  • 固定长度数据包(读取那么多字节然后停止)
  • 包含“长度”字段的数据包(读取长度字段,然后使用它来决定要读取多少字节)

如果您的协议不执行这些操作,那么您的读者就无法知道何时停止。哦,也许有超时——但我不建议依赖这些。

【讨论】:

    【解决方案3】:

    来自 Arduino 参考页面 (http://arduino.cc/en/Serial/Print):

    Serial.print(78, HEX) gives "4E" 
    

    所以:

    Serial.print(printbyte, HEX);
    

    应该给你你想要的输出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-16
      相关资源
      最近更新 更多