python - 如何将Python数字转换为1字节C类型?

标签 python c ctypes avr

我在 python 脚本(在我的笔记本电脑上)和 AVR 微 Controller 上运行的 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。

我还不知道为什么我会得到这些值。我觉得很奇怪,3 个最高有效位的翻转方式是这样的。为了暂时解决我的问题,直到我找出问题所在(查看是否是我的 UART 模块),我使用 25 个值的子集,并将我的值增加 4,以获得我想要的 0 - 100 范围。

关于python - 如何将Python数字转换为1字节C类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38558174/

相关文章:

c - 优化递归计数算法

有人能解释一下这个 C 代码片段将如何评估 w.r.t 序列点吗?

Python ctypes 没有正确返回一些通过引用传递的值

python - 使用 Python API 创建 GCE 实例

python - 将 XML 写入文件会损坏 python 中的文件

c - 输入 'Q' 时退出循环

python - 如何在 python 字符串中表示十六进制值?

C++:在函数中作为参数/指针传递的二维数组的访问值

python - 使用 sympy 将相似的术语放在一起

python - 如何在 python 中打印嵌套列表的所有可能性?