如何将Python编号转换为1字节C类型?

时间:2016-07-25 00:24:02

标签: python c ctypes avr

我在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很新。有没有人对我的逻辑不正确的地方有任何建议?

同样,我的猜测是转换并使用有符号和无符号数据类型。

感谢。

3 个答案:

答案 0 :(得分:0)

我发现了这个问题。代码是正确的。我的AVR板或UART模块有问题。当我发送值0 - 31时,电路板正在接收0b11100000 - 0b11111111。对于32-63,董事会正在收到0b00100000 - 0b00111111。对于64-95,董事会正在收到0b11100000 - ob11111111。对于96 - 100,该板正在接收0b11100000 - 0b11100100。

我不知道为什么我还能获得这些价值。我发现很奇怪3个最重要的部分正在翻转它们的方式。为了解决我的问题,直到我弄清楚是什么问题(看看它是否是我的UART模块)我使用25个值的子集并将我的值递增4以获得我想要的0-100范围。

答案 1 :(得分:0)

让我们快速浏览一下变速器的导线形式。总是起始位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编码。您编码为signed并解码为unsigned的部分也不重要,因为您使用0..127范围内的值。软件问题无论如何都会清除高位,格式问题通常只会改变一位奇偶校验。

我非常喜欢示波器跟踪以及串行线上实际连接的示意图。一些连接(例如通过电容器或变压器)需要足够频繁交替的模式,尽管所显示的模式令人惊讶。观察真正的导线模式至少会告诉我们失真发生在哪里,幸运的是它会发生什么样的变化。

答案 2 :(得分:0)

只是从“嫌疑人”中排除微控制器端软件并专注于通信线路 - 在MCU端连接Rx / Tx并尝试发送和接收刚刚发送的内容。 Campare你收到的与你发送的内容有关。发送和接收的缓冲区都应该匹配。然后我们肯定知道 - 感应器和接收器之间的通信线路设置有问题。