回显Linux发送给Arduino的数据

时间:2012-08-22 15:14:34

标签: php c linux arduino

我想回复Linux发送给Arduino的数据,这是一个十六进制命令,因为我需要PHP的回显数据才能读取。问题是我不想使用换行符来打印完整的数据。我想在没有Arduino读取的数据时打印它。这是代码:

我正在努力实现的目标:

  1. 如果没有\n
  2. ,如何发现一系列读取的结束
  3. 如何以所需格式打印十六进制。
  4. 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等?

3 个答案:

答案 0 :(得分:0)

您想要做的事情(几乎)可以通过替换

来完成
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;
}

UPDATE :Serial.print()命令是输出0xFF的那个...:我还没有理解你想修改输出 Arduino端。我不知道如何实现,需要修改Serial包的来源。在那里必须删除0x的地方会有一个“0x%02x”或“0x02X”。

关于读取序列的结束,您可以输出double \ n。然后,如果读取的字节为\ n pos为0,则表示Arduino已写入空行并且序列已停止。

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

答案 1 :(得分:0)

您的第一个问题是如何知道何时停止阅读,如果您不使用'\ n'终止数据包/命令/。

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

  • 像\ n这样的分隔符是一种常见的方法(如果你看到你已经读过分隔符就停止)
  • 固定长度数据包(读取多个字节然后停止)
  • 包含“length”字段的数据包(读取长度字段,然后使用它确定要读取多少字节)

如果您的协议没有做到这些,那么您的读者无法知道何时停止。哦,也许有超时 - 但我不建议依赖这些。

答案 2 :(得分:0)

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

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

所以:

Serial.print(printbyte, HEX);

应该为您提供所需的输出。