我試圖將浮點數據從arduino發送到python。數據以8個連續字節的數據(雙倍大小),然後換行符('\ n')發送。如何收集這些連續字節並將其轉換爲適當的格式在蟒蛇結束(系統端)從arduino收集'double'類型的數據
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;
}
蟒蛇code.Sure這不會打印正確的格式的數據,但只是想表明我曾嘗試。
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
模塊如圖上面的代碼能夠打印的浮點值。但是,如果我弄亂了time.sleep()或者停止傳輸並重新啓動它,打印出的錯誤值就會被打印出來。我猜錯誤的一組4字節正在解壓在這種情況下。關於我們可以在這裏做什麼的任何想法?
您一定會想要使用['struct'](http://docs.python.org/library/struct.html)模塊,但我不確定在漂浮時使用它是個好主意點數。也許你應該使用整數,或者使用你自己的二進制格式。另外,請記住,您以原始二進制表示形式發送該號碼,因此它肯定可以包含換行符的ASCII碼。你應該使用'read'而不是'readline'(並且忘記換行符,你不需要它) –
'struct.unpack'被仔細地寫入來正確解開通過線路接收到的IEEE 754浮點數,不管它們是怎麼樣的在運行Python的機器上表現出來。但它仍然希望接收指定格式的數據,發送方應確保發送數據。在你的問題提示下,我看了一下arduino的網站,並且很驚訝[學習](http://arduino.cc/en/Reference/Double),Arduino'double'實際上是單寬度精度數字,意思是' struct'必須是'f'格式,而不是'd'。我會更新答案。 – user4815162342