首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >回显Linux发送给Arduino的数据。

回显Linux发送给Arduino的数据。
EN

Stack Overflow用户
提问于 2012-08-22 15:14:33
回答 3查看 346关注 0票数 0

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

我想要做的是:

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

Arduino代码:

代码语言:javascript
复制
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示例代码在发送十六进制..。

代码语言:javascript
复制
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等等?

EN

回答 3

Stack Overflow用户

发布于 2012-08-22 15:19:06

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

代码语言:javascript
复制
Serial.print(printByte);
for(int i=0; i<=sizeof(printByte);i++){
   printByte[i]=0;
}

使用

代码语言:javascript
复制
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 %02x“或"0x02X”在那里的某处,0x必须被删除。

关于读取序列的结尾,您可以输出一个double \n。然后,如果读取字节为\n而pos为0,这将意味着Arduino编写了空行,而序列已经停止。

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

票数 0
EN

Stack Overflow用户

发布于 2012-08-22 16:08:26

您的第一个问题是如何知道什么时候停止读取,如果您不使用'\n‘终止数据包/命令/任何东西。

答案是,您必须建立某种方法来了解协议中的读入量。串行通信中没有任何固有的内容可以告诉您序列何时结束。只是一个字节流。

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

如果你的协议没有做任何这些事情,你的读者就不可能知道什么时候停止。哦,也许是暂停--但我不建议依赖这些。

票数 0
EN

Stack Overflow用户

发布于 2012-08-22 20:20:51

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

代码语言:javascript
复制
Serial.print(78, HEX) gives "4E" 

所以:

代码语言:javascript
复制
Serial.print(printbyte, HEX);

应该给你你想要的输出。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12076240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档