簡體   English   中英

如何將Python數字轉換為1個字節的C類型?

[英]How can I convert Python number to 1 byte C type?

我在筆記本電腦上的python腳本和AVR微控制器上運行的C程序之間的通訊出現問題。 他們正在通過UART通信。 我的問題是現在,我進行了以下設置。

Python發送數據:

data = port.write(struct.pack("b", val))

Python讀取數據:

v = struct.unpack('B', d)[0]
print "%s: %d" % ( time.ctime(time.time()), v )

C(AVR)讀取數據:

received = (uint8_t) UDR0;

C(AVR)寫入數據(回聲):

UDR0 = received;

我的問題是與此設置有關,我的python腳本返回的數字如下:

發送:0-31,接收:224-255發送:32-63接收:32-63發送:62-95接收:224-255發送:96-100接收:224-228

我不明白為什么這些數字匹配它們的狀態,但是我懷疑這是因為我的數據類型。 我考慮過使用chr()和ord()在字符之間來回轉換,但是必須有一種更簡單(更易於理解)的方式。 我開始研究python中的ctypes,並希望使用c_ubyte函數,但無法弄清楚如何正確使用它。 我對python相當陌生。 有人對我的邏輯不正確之處有任何建議嗎?

同樣,我的猜測是轉換並使用有符號和無符號數據類型。

謝謝。

我發現了問題。 代碼正確。 我的AVR板或UART模塊有問題。 當我發送值0-31時,開發板正在接收0b11100000-0b11111111。 對於32-63,開發板收到0b00100000-0b00111111。 對於64-95,開發板接收到0b11100000-ob11111111。 對於96-100,董事會收到0b11100000-0b11100100。

我不知道為什么我要獲得這些價值。 我感到非常奇怪的是,三個最高有效位正在顛覆現狀。 為了解決我的問題,直到我找出問題所在(調查它是否是我的UART模塊),我使用25個值的子集並將我的值增加4以得到想要的0-100范圍。

讓我們快速看一下變速箱的電線形式。 總是有一個開始位0,然后是8個數據位(首先是LSB),然后是一個停止位1。從描述中,我們得到3位的奇怪數據,以5位校正,因此有8種模式可比較。 我將在此處從右向左書寫電匯格式。

>>> for i,highbits in enumerate('111 001 111 111 111'.split()):
...   print '1{:03b}ddddd0\t1{}ddddd0'.format(i,highbits)
...
1000ddddd0      1111ddddd0
1001ddddd0      1001ddddd0
1010ddddd0      1111ddddd0
1011ddddd0      1111ddddd0
1100ddddd0      1111ddddd0

我們沒有整套測試數據。 我們看到的是一堆組合,其中設置了不應設置的位,以及一組看起來正確的異常(0x20-0x3f)。 模擬時序問題可以解釋某些行為(至少始終設置了第5位),但是第二個模式變低而第四個模式沒有變低,這似乎很奇怪。

我缺乏具體的想法。 值太低,不會引起問題,例如將文件描述符設置為UTF-8編碼。 編碼為有符號的部分和解碼為無符號的部分也無關緊要,因為您使用的是0..127范圍內的值。 無論如何,軟件問題通常都會清除高位,而格式問題通常只會為奇偶校驗改變一位。

我真的很想要示波器軌跡以及串行線路上實際連接的原理圖。 某些連接(例如通過電容器或變壓器)需要的圖案要經常交替變化,盡管所示的圖案令人驚訝。 觀察真實的電線圖案至少可以告訴我們失真發生在哪里,而幸運的是,它是什么樣的變化。

只是為了從“疑點”中排除微控制器方面的軟件並專注於通信線路-在MCU方面連接Rx / Tx並嘗試發送和接收剛發送的內容。 將您收到的內容與發送的內容進行比較。 發送和接收的緩沖區都應該匹配。 然后我們可以肯定地知道-傳感器和接收器之間的通信線路設置有問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM