【问题标题】:Raspberry Pi send data more than 1 byte (e.g. integer 1920) to Arduino by USB cable (serial)Raspberry Pi 通过 USB 电缆(串行)向 Arduino 发送超过 1 个字节(例如整数 1920)的数据
【发布时间】:2020-11-23 18:15:24
【问题描述】:

目前,我的项目是从连接到树莓派 3B+ 的网络摄像头获取 x 坐标,cX 值,并将其发送到 Arduino Uno。当整数在 0 到 255 的范围内时,我成功地执行了操作。我可以修改我的代码并向 Arduino 发送一个更大的整数,比如 1920 吗?

这是我在 raspi 端的 python 代码的一部分:

import serial
import struct

while True:
        ...
        cX = 248  //I want to send a larger number
        print (cX)
        ser.write(struct.pack('>H', cX))
        ...

这是我在 Arduino 上的 c 代码的一部分:

int cX = 0;

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

void loop()
{
 if (Serial.available()) 
 {
   cX = Serial.read();
   if (cX == 248)
    {
     //do something 
    }
 }
}

任何帮助将不胜感激

【问题讨论】:

  • 您在 Arduino 代码中一次只能读取 1 个字节。这意味着您将无法读取大于 255 的值。请参阅Serial.readBytes() 以便能够接收超过 1 个字节,在这种情况下,2 个字节将允许您发送高达 65535 的值。
  • 感谢您的及时回复,雨果。
  • 所以对于 2 个字节,我需要编写 Serial.readBytes(buffer, 2)。我有几个问题:我应该为变量缓冲区声明什么?我检查了这个例子,它说的是字节或字符,所以它应该是字节[2]?我可以简单地将值转换为 int cX = Serial.readBytes(bytes[2],2) 吗?另一个问题是关于 ser.write(struct.pack('>H', cX)) 已经发送超过 1 个字节的整数的 python 端?
  • 在下面查看我的答案。

标签: interface arduino raspberry-pi serial-port communication


【解决方案1】:

在 Arduino 端试试这个:

unsigned int cX = 0;
byte buffer[2] = {0};
size_t len = 0;

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

void loop()
{
    if (Serial.available())
    {
        len = Serial.readBytes(buffer, 2);
        if (len == 2)
        {
            cX = (((int)buffer[0]) << 8) | buffer[1];
            if (cX == 1920)
            {
                //do something
            }
        }
    }
}

在 Python 方面,我不知道详细信息,但从我在文档中看到的内容来看,使用参数 &gt;H 您应该发送 unsigned short(2 字节大小),大端,所以它应该可以工作。

【讨论】:

  • 程序没有确保发送者和接收者同步的机制(例如消息协议)。例如,停止并重新启动 Arduino。重启后是否总能收到正确的数据?
  • 我理解你的观点并同意。但这里的重点不是编写功能齐全的代码,而是指导 OP 如何解决该特定问题 - 通过串行接口发送大于 255 的值。
  • 我试过Hugo的代码,只要大于32767就可以工作,发送32768时返回-32768。所以我认为在arduino中将int更改为long类型会更合适。除了锯末响应,当 arduino 关闭并重新连接时,我应该怎么做才能同步数据?
  • 使用这种传输方式,是不是意味着数据传输速度会减半。即 9600 的欺诈率,每秒 9600 比特,原本我每秒可以发送 9600/8= 1200 个数字,现在我每秒只能发送 600 个数字?
  • int cX 定义更改为 unsigned int cX,您将能够表示从 0 到 65535 的值,而不会增加有效负载大小。检查编辑的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多