python - 从arduino收集 'double'类型数据

标签 python c arduino atmega

我正在尝试将 float 据从arduino发送到python。数据以8个连续字节的数据( double 大小)后跟换行符('\n')发送。如何收集这些连续字节和在python端(系统端)转换为正确的格式

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

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

    USART_send('\n');
}

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

python 代码。当然,这不会以正确的格式打印数据,但只是想展示我尝试过的内容。

import serial,time

my_port = serial.Serial('/dev/tty.usbmodemfa131',19200)
while 1:
    print my_port.readline(),
    time.sleep(0.15)

更新:

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

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

使用如上面代码所示的struct模块能够打印浮点值。但是,

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

最佳答案

在 Arduino 上,一个 doublethe same as float ,即小端 single-precision floating-point number占用4字节内存。这意味着您应该正好读取 5 个字节,使用 f 的小端字节序变体。格式来解压它,并忽略尾随的换行符 x :

import struct
...

data = my_port.read(5)
num, = struct.unpack('<fx', data)

请注意,您不想使用 readline因为 float 表示的任何字节都可以是 '\n' .

正如 Nikklas B. 指出的那样,您甚至根本不需要考虑换行符,只需发送 4 个字节并从 Python 中读取尽可能多的字节即可。在这种情况下,格式字符串将为 '<f' .

关于python - 从arduino收集 'double'类型数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12556096/

相关文章:

python - Flask-SocketIo,如何在python线程和socketio.start_background_task线程之间共享数据?

python - 如何在 celery 中将任务从一个队列移动到另一个队列

将 uint16_t 转换为 char[2] 以通过套接字发送 (unix)

function - 使用Arduino淡入多个LED

python - 具有 CuDNNLSTM 层的 Keras 模型在生产服务器上不起作用

python - 如果我有一个单词列表,如何有效地检查字符串是否不包含列表中的任何单词?

android - 如何找到所有连接到路由器的esp8266

php - 为什么 client.available() 返回 0? (阿杜伊诺)

c - 无论输入如何,Min 函数都会给出输出 6422164

android - 未定义对 `cnss_get_platform_cap' 的引用