从Arduino向Python发送浮点型数据

2024-10-01 17:27:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要从Python向Arduino发送float数据,并返回相同的值。我想先从Arduino号发送一些浮动数据。数据以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代码(系统端):

^{pr2}$

{1>可以使用cd1>模块中的值来打印。在

50%的情况下,数据打印正确。但是,如果我搞乱了time.sleep()或停止传输并重新启动,则会打印出不正确的值。我认为在这种情况下,解包错误的4字节集。你知道我们能做什么吗?在

除了使用struct模块发送和接收Arduino的浮点数据之外,还有其他想法吗?在


Tags: 模块数据代码data字节my系统block
3条回答

因为这个问题在搜索引擎中排名很高,所以我想出了一个可行的解决方案。在

警告:除非需要全浮点精度,否则转换为字符串并发送(使用sprintf或dtostf,或使用连续打印(值,NumberOfDecimalPlaces)(documentation))。这是因为以下解决方案a)不适用于具有不同端点的计算机;b)某些字节可能被误解为控制字符。在

解决方案:获取浮点数的指针,然后将其作为字节数组传递给串行写入(). 在

例如

/*
Code to test send_float function
Generates random numbers and sends them over serial

*/

void send_float (float arg)
{
  // get access to the float as a byte-array:
  byte * data = (byte *) &arg; 

  // write the data to the serial
  Serial.write (data, sizeof (arg));
  Serial.println();
}


void setup(){
  randomSeed(analogRead(0));  //Generate random number seed from unconnected pin
  Serial.begin(9600); //Begin Serial
}

void loop()
{
  int v1 = random(300); //Generate two random ints
  int v2 = random(300);
  float test = ((float) v1)/((float) v2);  // Then generate a random float

  Serial.print("m");  // Print test variable as string
  Serial.print(test,11);
  Serial.println();

  //print test variable as float
  Serial.print("d"); send_float(test);
  Serial.flush();
  //delay(1000);

}

然后为了在python中接收到这个,我使用了您的解决方案,并添加了一个函数来比较这两个输出,以便于验证。在

^{pr2}$

参考文献: Sending a floating point number from python to arduinoHow to send float over serial

简而言之,软件和硬件之间有一些交互作用。我不知道你是怎么阻止传输的。我怀疑您所做的一切实际上都是在停止发送中间字节的字节,因此在您启动备份时注入一个新的字节。这个时间。睡觉()部分原因可能是某些硬件缓冲区溢出,并且丢失字节,从而导致对齐偏移。一旦你开始从一个浮点中获取几个字节,从另一个浮点中获取几个字节,你就会开始得到错误的答案。在

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

我不知道Python,但是,Arduino发送这样的号码有什么问题:

value= 1.234;
Serial.println(value);

为了让Arduino接收浮子:

^{pr2}$

注意这段代码是未测试的,尽管与我过去使用的代码非常相似。在

相关问题 更多 >

    热门问题