python - 将浮点型数据从 Arduino 发送到 Python

标签 python c arduino atmega

我需要从 Python 向 Arduino 发送 float 据并返回相同的值。我想先从 Arduino 发送一些 float 数据。数据以 4 个连续字节的形式发送。我试图弄清楚如何收集这些连续的字节并在 Python 端(系统端)将其转换为正确的格式

Arduino代码:

void USART_transmitdouble(double* d)
{
    union Sharedblock
    {
        char part[4];
        double data;

    } my_block;
    my_block.data = *d;
    for(int i=0;i<4;++i)
    {
        USART_send(my_block.part[i]);
    }


}

int main()
{
    USART_init();
    double dble=5.5;
    while(1)
    {
       USART_transmitdouble(&dble);
    }
    return 0;
}

Python代码(系统端):

my_ser = serial.Serial('/dev/tty.usbmodemfa131',19200)

while 1:
    #a = raw_input('enter a value:')
    #my_ser.write(a)
    data = my_ser.read(4)
    f_data, = struct.unpack('<f',data)
    print f_data
    #time.sleep(0.5)

如上代码所示,使用 struct 模块可以打印浮点值。

50% 的时间,数据打印正确。但是,如果我弄乱了 time.sleep() 或停止传输并重新启动它,则会打印出不正确的值。我认为在这种情况下解压缩了一组错误的 4 个字节。知道我们可以在这里做什么吗?

除了使用 struct 模块向 Arduino 发送和接收 float 据外,还有其他想法吗?

最佳答案

嗯,简短的回答是软件和硬件之间正在进行一些交互。我不确定你是如何停止传输的。我怀疑你在做什么实际上是在停止发送中间字节的字节,因此在你开始备份时注入(inject)一个新字节。 time.sleep() 部分可能是某些硬件缓冲区溢出并且您正在丢失导致对齐偏移的字节。一旦您开始从一个 float 中获取几个字节并从另一个 float 中获取几个字节,您就会开始得到错误的答案。

我注意到的一件事是您没有任何对齐机制。使用 UART 通常很难做到这一点,因为您只能发送字节。一种方法是来回发送握手。计算机说重新启动,硬件重新启动连接(停止发送内容,清除它拥有的缓冲区等)并发送一些魔法,如 0xDEADBEEF。然后计算机可以找到这个 0xDEADBEEF 并知道下一条消息将从哪里开始。您仍然需要了解硬件/操作系统中存在的任何缓冲区,并采取预防措施以免溢出它们。从 XON/XOFF 到实际的硬件流控制,有多种流控制方法。

关于python - 将浮点型数据从 Arduino 发送到 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12664826/

相关文章:

python - 如何修复此 'cmd' 无法识别错误以在 VSCode 中进行调试?

python - 需要帮助格式化 .txt 文件并将其放入数据框中

c - 尝试使用 mpiicc 将 argv 发送到新进程

c - C中重复某个菜单的函数

c - ESP32s NodeMCU 无法识别 SD 卡突破 : "Card Mount Failed"

python - 我如何在 python 3 中播放声音?

c - 需要制作一个非常大的数组 [2^16+1][2^16+1] - 数组的大小太大 :(

c++ - 如何将字节转换为十六进制字符

c++ - 在两个不同的 .o 文件中对多个函数进行多重定义。

python - asyncio.sleep() 与 time.sleep()